【问题标题】:returning multiple items from a PHP iterator从 PHP 迭代器返回多个项目
【发布时间】:2018-10-18 02:42:18
【问题描述】:

PHP 迭代器对象是否有办法有时从单个项目返回多个项目?

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

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

我想要一个 Iterator 对象来接受它并产生以下项目:

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

【问题讨论】:

  • 除了double还有什么?
  • double double 6 可能吗?
  • 这是什么?代码高尔夫?
  • 这可能会有一个很好的解释,但为什么不返回数组呢?通常在类似的情况下,我的代码很脆弱,返回数组就绰绰有余了。
  • 我不明白为什么是代码高尔夫。这是一个愚蠢的例子,因为我的实际用例很复杂。我想在数组上使用迭代器,对于源中的某些项目,我希望迭代器返回多个项目。

标签: php iterator


【解决方案1】:

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

$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】:

    自发布问题以来,我想到的一种方法是改用生成器:

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

    【讨论】:

      【解决方案3】:

      你必须为这样的字符串创建明确的数组

      "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

      【讨论】:

      • 我特别想使用 Iterator 类,而不是 foreach。抱歉,问题应该更清楚。
      • 分享更多示例
      • 我的实际用例有很多细节,只会在这里增加噪音。它实际上只是归结为:有时,被迭代的数据中的一个项目应该产生多个项目。
      • @joachim:你还想回答还是想删除你的问题?
      猜你喜欢
      • 2018-06-15
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      • 2012-12-07
      • 2021-12-26
      • 2013-04-24
      • 2015-09-20
      • 2018-07-24
      相关资源
      最近更新 更多