有没有办法让PHP Iterator对象有时从单个项目中返回多个项目?
例如,假设我有一个数组:
$a = ['1','2','3','double 6','4'];
我希望有一个Iterator对象来获取它并产生以下项目:
答案 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);
?>