PHP 迭代器转换为数组 iterator_to_array

一般情况下,PHP 中的迭代器和生成器都是配合 foreach 语句使用的。

但有些情况下,我们不得不将一个迭代器或生成器转换为数组,也就是一次性获取迭代器或生成器的所有值。

这种要求,我们要如何实现呢 ?

最容易想到的方式,就是使用 foreach 语句遍历一遍,将值赋值给一个数组,代码类似于

<?php

function count_to_ten()
{
    foreach (range(0,10) as $v)
    {
        yield $v;
    }
}

$nums = array();

foreach (count_to_ten() as $num)
{
    $nums[] = $num;
}

print_r($nums);

运行结果为

[yufei@www.twle.cn helloworld]$ php demo.php
Array
(
    [0] => 0
    [1] => 1
    [2] => 2
    [3] => 3
    [4] => 4
    [5] => 5
    [6] => 6
    [7] => 7
    [8] => 8
    [9] => 9
    [10] => 10
)

因为这种需求是如此的常见,所以 PHP 也按照上面的思维实现了一个 iterator_to_array() 函数,但功能远远比我们写的强大太多了。

PHP iterator_to_array() 函数

PHP 在 5.1.0 中就引入了 iterator_to_array() 函数,用于将一个迭代器或生成器转换为一个数组。

该函数的原型如下

array iterator_to_array ( Traversable $iterator [, bool $use_keys = true ] )
参数 说明
iterator 要转换的迭代器或生成器
use_keys 是否使用迭代器或生成器自己的键作为索引,默认为 true 。PHP 5.2.1 中新增

范例一

将一个关联数组迭代器转换为数组

  1. 保持迭代器原来的键

    $iterator = new ArrayIterator(array('recipe'=>'pancakes', 'egg', 'milk', 'flour'));
    var_dump(iterator_to_array($iterator, true));
    

    输出结果为

    array(4) {
      ["recipe"]=>
      string(8) "pancakes"
      [0]=>
      string(3) "egg"
      [1]=>
      string(4) "milk"
      [2]=>
      string(5) "flour"
    }
    
  2. 不使用迭代器的键,而是保存为一个数组

    $iterator = new ArrayIterator(array('recipe'=>'pancakes', 'egg', 'milk', 'flour'));
    var_dump(iterator_to_array($iterator, false));
    

    输出结果为

    array(4) {
      [0]=>
      string(8) "pancakes"
      [1]=>
      string(3) "egg"
      [2]=>
      string(4) "milk"
      [3]=>
      string(5) "flour"
    }
    

范例二: iterator_to_array() 函数同样也可以用于生成器

iterator_to_array() 函数同样也可以用于生成器,可以将一个生成器转换为数组

<?php

function count_to_ten()
{
    foreach (range(0,10) as $v)
    {
        yield $v;
    }
}

$nums = iterator_to_array(count_to_ten());
print_r($nums);

输出结果为

Array
(
    [0] => 0
    [1] => 1
    [2] => 2
    [3] => 3
    [4] => 4
    [5] => 5
    [6] => 6
    [7] => 7
    [8] => 8
    [9] => 9
    [10] => 10
)
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.