Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从PHP迭代器返回多个项_Php_Iterator - Fatal编程技术网

从PHP迭代器返回多个项

从PHP迭代器返回多个项,php,iterator,Php,Iterator,PHP迭代器对象有时可以从单个项返回多个项吗 例如,假设我有一个数组: $a=['1','2','3','double 6','4'] 我想要一个迭代器对象,它接受这一点并生成以下项: 一, 二, 三, 六, 六, 四, 对于这样的字符串,您必须使用明确的数组 “双倍”=>2,“三倍”=>3,“四倍”=>4,“五倍”=>5 <?php $str = ["double"=>2,"triple"=>3,"quadruple"=>4, "quintuple"=>5]

PHP迭代器对象有时可以从单个项返回多个项吗

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

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

我想要一个迭代器对象,它接受这一点并生成以下项:

  • 一,
  • 二,
  • 三,
  • 六,
  • 六,
  • 四,

对于这样的字符串,您必须使用明确的数组

“双倍”=>2,“三倍”=>3,“四倍”=>4,“五倍”=>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);
?>


发布问题后,我想到的一种方法是使用生成器:


函数my_迭代($data){
foreach($数据作为$项){
如果(是双倍){
收益$项目;
收益$项目;
}
否则{
收益$项目;
}
}
}

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

$array = ['1', '2', '3', ['6', '6'], '4'];
然后使用:

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

$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)));

这是。

除了
双精度
之外还有什么?
双精度6
可能吗?这是什么?代码高尔夫?这可能会有一个很好的解释,但为什么不返回数组呢?通常在类似的情况下,我的代码很脆弱,返回数组就足够了。我不明白为什么代码是高尔夫。这是一个愚蠢的例子,因为我的实际用例很复杂。我希望在数组上使用迭代器,对于源代码中的某些项,我希望迭代器返回多个项。我特别希望使用迭代器类,而不是foreach。对不起,这个问题应该更清楚一些。再分享一些例子。我的实际用例有很多细节,这只会增加噪音。它实际上可以归结为:有时候,被迭代的数据中的一项应该产生不止一项。@joachim:您仍然想要答案还是要删除您的问题?
$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)));