• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • iterator_to_array()

    (PHP 5 >= 5.1.0, PHP 7)

    将迭代器中的元素拷贝到数组

    说明

    iterator_to_array(Traversable$iterator[,bool $use_keys= true]): array

    将迭代器中的元素拷贝到数组。

    参数

    $iterator

    被拷贝的迭代器。

    $use_keys

    是否使用迭代器元素键作为索引。

    返回值

    一个数组,包含迭代器中的元素。

    更新日志

    版本说明
    5.2.1添加了$use_keys参数。

    范例

    iterator_to_array() example

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

    以上例程会输出:

    array(4) {
      ["recipe"]=>
      string(8) "pancakes"
      [0]=>
      string(3) "egg"
      [1]=>
      string(4) "milk"
      [2]=>
      string(5) "flour"
    }
    array(4) {
      [0]=>
      string(8) "pancakes"
      [1]=>
      string(3) "egg"
      [2]=>
      string(4) "milk"
      [3]=>
      string(5) "flour"
    }
    
    To generate an deep array from nested iterators:
    <?php
    function iterator_to_array_deep(\Traversable $iterator, $use_keys = true) {
      $array = array();
      foreach ($iterator as $key => $value) {
        if ($value instanceof \Iterator) {
          $value = iterator_to_array_deep($value, $use_keys);
        }
        if ($use_keys) {
          $array[$key] = $value;
        } else {
          $array[] = $value;
        }
      }
      return $array;
    }
    ?>
    I use it to test an iterator: https://gist.github.com/jm42/cb328106f393eeb28751
    Using the boolean param :
    <?php
    $first = new ArrayIterator( array('k1' => 'a' , 'k2' => 'b', 'k3' => 'c', 'k4' => 'd') );
    $second = new ArrayIterator( array( 'k1' => 'X', 'k2' => 'Y', 'Z' ) );
    $combinedIterator= new AppendIterator();
    $combinedIterator->append( $first );
    $combinedIterator->append( $second );
    var_dump( iterator_to_array($combinedIterator, false) );
    ?>
    will output : 
    array(7) (
     [0]=>
     string(1) "a"
     [1]=>
     string(1) "b"
     [2]=>
     string(1) "c"
     [3]=>
     string(1) "d"
     [4]=>
     string(1) "X"
     [5]=>
     string(1) "Y"
     [6]=>
     string(1) "Z"
    )
    <?php
    var_dump( iterator_to_array($combinedIterator, true) );
    ?>
    will output (since keys would merge) :
    array(5) (
     ["k1"]=>
     string(1) "X"
     ["k2"]=>
     string(1) "Y"
     ["k3"]=>
     string(1) "c"
     ["k4"]=>
     string(1) "d"
     [0]=>
     string(1) "Z"
    )
    Generator approach
    function scandir_deep($dir)
    {
     foreach (scandir($dir) as $key => $value)
      if (in_array($value, [".",".."]))
       continue;
      else if (is_dir($dir . DIRECTORY_SEPARATOR . $value))
       yield $value => scandir_deep($dir . DIRECTORY_SEPARATOR . $value);
      else
       yield $value;
    }
    When using iterator_to_array() on an SplObjectStorage object, it's advisable to set $use_keys to false.
    The resulting array is identical, since the iterator keys produced by SplObjectStorage::key() are always integers from 0 to (COUNT-1). Passing $use_keys=false cuts out the unnecessary calls to SplObjectStorage::key(), giving a slight performance advantage.
    The use_keys parameter was added in one of the 5.2.x releases; it defaults to TRUE. This matches the behavior in PHP 5.1.6, which lacks this parameter.