- 1、如何RecursiveIteratorIterator在PHP中工作
- 2、php迭代器iterator怎麼用
- 3、什麼是迭代器 iterator
Some speed tests
?php
$timer = function ($name = ‘default’, $unset_timer = TRUE)
{
static $timers = array();
if ( isset( $timers[ $name ] ) )
{
list($s_sec, $s_mic) = explode(‘ ‘, $timers[ $name ]);
list($e_sec, $e_mic) = explode(‘ ‘, microtime());
if ( $unset_timer )
unset( $timers[ $name ] );
return $e_sec – $s_sec + ( $e_mic – $s_mic );
}
$timers[ $name ] = microtime();
};
function f1 ($array) {
$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($array), RecursiveIteratorIterator::SELF_FIRST);
foreach ( $iterator as $key = $value ) {
if ( is_array($value) )
continue;
}
}
function f2($array) {
foreach ( $array as $key = $value ) {
if ( is_array($value) )
f2($value);
}
}
foreach ( [100, 1000, 10000, 100000, 1000000] as $num )
{
$array = [];
for ( $i = 0; ++$i $num; )
$array[] = [1,2,3=[4,5,6=[7,8,9=10,11,12=[13,14,15=[16,17,18]]]]];
$timer();
f1($array);
printf(“RecursiveIteratorIterator: %7d elements – %.3f sec\n”, $num, $timer());
$timer();
f2($array);
printf(“Recursive function : %7d elements – %.3f sec\n”, $num, $timer());
}
?
Output (PHP 5.4.9-4ubuntu2.1 (cli) (built: Jun 11 2013 13:10:01))
=======================
RecursiveIteratorIterator: 100 elements – 0.007 sec
Recursive function : 100 elements – 0.002 sec
RecursiveIteratorIterator: 1000 elements – 0.036 sec
Recursive function : 1000 elements – 0.024 sec
RecursiveIteratorIterator: 10000 elements – 0.425 sec
Recursive function : 10000 elements – 0.263 sec
RecursiveIteratorIterator: 100000 elements – 8.153 sec
Recursive function : 100000 elements – 2.654 sec
RecursiveIteratorIterator: 1000000 elements – 474.483 sec
Recursive function : 1000000 elements – 26.872 sec
For one million elements recursive function is more quickly!
up
down
7 Adil Baig @ AIdezigns ¶5 years ago
A very important thing to note about \RecursiveIteratorIterator is that it returns a flattened array when used with the iterator_to_array function. Ex:
?php
$arr = array(‘Zero’, ‘name’=’Adil’, ‘address’ = array( ‘city’=’Dubai’, ‘tel’ = array(‘int’ = 971, ‘tel’=12345487)), ” = ‘nothing’);
$iterator = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($arr));
var_dump(iterator_to_array($iterator,true));
?
This code will return :
array(6) {
[0]=
string(4) “Zero”
[“name”]=
string(4) “Adil”
[“city”]=
string(5) “Dubai”
[“int”]=
int(91)
[“tel”]=
int(12345487)
[“”]=
string(7) “nothing”
}
To get the non-flattened proper array use the getArrayCopy() method, like so :
$iterator-getArrayCopy()
This will return
array(4) {
[0]=
string(4) “Zero”
[“name”]=
string(4) “Adil”
[“address”]=
array(2) {
[“city”]=
string(5) “Dubai”
[“tel”]=
array(2) {
[“int”]=
int(91)
[“tel”]=
int(12345487)
}
}
[“”]=
string(7) “nothing”
}
up
down
6 aidan at php dot net ¶6 years ago
This example demonstrates using the getDepth() method with a RecursiveArrayIterator.
?php
$tree = array();
$tree[1][2][3] = ‘lemon’;
$tree[1][4] = ‘melon’;
$tree[2][3] = ‘orange’;
$tree[2][5] = ‘grape’;
$tree[3] = ‘pineapple’;
print_r($tree);
$arrayiter = new RecursiveArrayIterator($tree);
$iteriter = new RecursiveIteratorIterator($arrayiter);
foreach ($iteriter as $key = $value) {
$d = $iteriter-getDepth();
echo “depth=$d k=$key v=$value\n”;
}
?
The output of this would be:
Array
(
[1] = Array
(
[2] = Array
(
[3] = lemon
)
[4] = melon
)
[2] = Array
(
[3] = orange
[5] = grape
)
[3] = pineapple
)
depth=2 k=3 v=lemon
depth=1 k=4 v=melon
depth=1 k=3 v=orange
depth=1 k=5 v=grape
depth=0 k=3 v=pineapple
up
down
4 fengdingbo at gmail dot com ¶3 years ago
if you want traversal directory。
?php
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator(“./”)) as $key=$val)
{
echo $key,”=”,$val,”\n”;
}
?
up
down
8 Michiel Brandenburg ¶7 years ago
You can use this to quickly find all the files (recursively) in a certain directory. This beats maintaining a stack yourself.
?php
$directory = “/tmp/”;
$fileSPLObjects = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($directory),
RecursiveIteratorIterator::CHILD_FIRST
);
try {
foreach( $fileSPLObjects as $fullFileName = $fileSPLObject ) {
print $fullFileName . ” ” . $fileSPLObject-getFilename() . “\n”;
}
}
catch (UnexpectedValueException $e) {
printf(“Directory [%s] contained a directory we can not recurse into”, $directory);
}
?
Note: if there is a directory contained within the directory you are searching in that you have no access to read an UnexpectedValueException will be thrown (leaving you with an empty list).
Note: objects returned are SPLFileObjects
up
down
1 gerry at king-foo dot be ¶2 years ago
Carefull when using iterator_to_array(). Because it flattens down your subiterators, elements with the same keys will overwrite eachother.
For example:
?php
$iterator = new RecursiveIteratorIterator(
new RecursiveArrayIterator([
[‘foo’, ‘bar’],
[‘baz’, ‘qux’]
])
);
foreach ($iterator as $element) {
echo $element;
}
?
This will output all 4 elements as expected:
string(3) “foo”
string(3) “bar”
string(3) “baz”
string(3) “qux”
While doing:
?php
var_dump(iterator_to_array($iterator));
?
will output an array with only the last 2 elements:
array(2) {
[0]=
string(3) “baz”
[1]=
string(3) “qux”
}
使用foreach 與使用迭代器,並不衝突
迭代器可以使用在:
1、使用返回迭代器的包或庫時(如PHP5中的SPL迭代器)
2、無法在一次的調用獲取容器的所有元素時
3、要處理數量巨大的無素時(數據庫中的表以GB計的數據)
迭代器還可以用來構造一些數據結構。
你可以去後盾人平台看看,裏面的東西不錯
迭代器(iterator)有時又稱游標(cursor)是程序設計的軟件設計模式,可在容器(container,例如鏈表或陣列)上遍訪的接口,設計人員無需關心容器的內容。
為了方便的處理集合中的元素,Java中出現了一個對象,該對象提供了一些方法專門處理集合中的元素.
例如刪除和獲取集合中的元素.該對象就叫做迭代器(Iterator).
對 Collection 進行迭代的類,稱其為迭代器。還是面向對象的思想,專業對象做專業的事情,迭代器就是專門取出集合元素的對象。
但是該對象比較特殊,不能直接創建對象(通過new),該對象是以內部類的形式存在於每個集合類的內部。
原創文章,作者:D5QWB,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/127133.html