возврат нескольких элементов из итератора PHP - PullRequest
0 голосов
/ 08 мая 2018

Есть ли способ с помощью объекта PHP Iterator иногда возвращать несколько элементов из одного элемента?

Например, предположим, у меня есть массив:

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

и я хочу иметь объект Iterator, который принимает это и производит следующие элементы:

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

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

Один из способов, который произошел со мной после публикации вопроса, - использовать генератор вместо:

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

0 голосов
/ 10 мая 2018

Это похоже на выравнивание массива. Если вас не беспокоит память, вы можете использовать исходный массив в следующей форме:

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

Вот демо .

0 голосов
/ 08 мая 2018

Вы должны создать определенный массив для такой строки, как

"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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...