Code前端首页关于Code前端联系我们

php中的iterator(“PHP”)

terry 2年前 (2023-09-30) 阅读数 58 #PHP
文章标签 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前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门