从PHP迭代器返回多个项目

时间:2018-05-08 07:54:32

标签: php iterator

有没有办法让PHP Iterator对象有时从单个项目中返回多个项目?

例如,假设我有一个数组:

$a = ['1','2','3','double 6','4'];

我希望有一个Iterator对象来获取它并产生以下项目:

  • 1
  • 2
  • 3
  • 6
  • 6
  • 4

3 个答案:

答案 0 :(得分:0)

自发布问题以来我发现的一种方法是改为使用Generator:

function my_iteration($data) { foreach ($data as $item) { if (IS DOUBLE) { yield $item; yield $item; } else { yield $item; } } }

答案 1 :(得分:0)

这看起来像是扁平化阵列。如果您不担心内存,可以使用以下格式的初始数组:

$array = ['1', '2', '3', ['6', '6'], '4'];

然后使用RecursiveIteratorIterator

function flatArray1($array): iterator
{
    $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
    foreach ($iterator as $item) {
        yield $item;   
    }
}

print_r(iterator_to_array(flatArray1($array)));

如果你想使用更少的内存,你可以使用一种初始数组的压缩版本:

$array = ['1', '2', '3', [2, '6'], '4'];

function flatArray2($array): iterator
{
    foreach ($array as $item) {
        if (is_array($item)) {
            [$count, $item] = $item;

            while ($count) {
                yield $item;

                $count -= 1;
            }

            continue;
        }

        yield $item;
    }
}

print_r(iterator_to_array(flatArray2($array)));

这是the demo

答案 2 :(得分:-1)

你必须为这样的字符串制作明确的数组,如

"double"=>2,"triple"=>3,"quadruple"=>4, "quintuple"=>5

<?php
  $str = ["double"=>2,"triple"=>3,"quadruple"=>4, "quintuple"=>5];
  $a = ['1','2','3','double 6','4'];
  foreach($a as $key=>$val){
    $val = explode(" ",$val);
    if(count($val) > 1){
      $a[$key] = $val[1];
      for($i=1;$i<$str[$val[0]];$i++){
        $a[] = $val[1];
      }
    }
  }
  sort($a);
  print_r($a);
?>

Live Demo