php中的iterator(“PHP”)
本文目录一览:
- 1、如何RecursiveIteratorIterator在PHP中工作
- 2、php迭代器iterator怎么用
- 3、什么是迭代器 iterator
如何RecursiveIteratorIterator在PHP中工作
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"
}
php迭代器iterator怎么用
使用foreach 与使用迭代器,并不冲突
迭代器可以使用在:
1、使用返回迭代器的包或库时(如PHP5中的SPL迭代器)
2、无法在一次的调用获取容器的所有元素时
3、要处理数量巨大的无素时(数据库中的表以GB计的数据)
迭代器还可以用来构造一些数据结构。
你可以去后盾人平台看看,里面的东西不错
什么是迭代器 iterator
迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器(container,例如链表或阵列)上遍访的接口,设计人员无需关心容器的内容。
为了方便的处理集合中的元素,Java中出现了一个对象,该对象提供了一些方法专门处理集合中的元素.
例如删除和获取集合中的元素.该对象就叫做迭代器(Iterator).
对 Collection 进行迭代的类,称其为迭代器。还是面向对象的思想,专业对象做专业的事情,迭代器就是专门取出集合元素的对象。
但是该对象比较特殊,不能直接创建对象(通过new),该对象是以内部类的形式存在于每个集合类的内部。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。