【问题标题】:Dynamically generating foreach动态生成foreach
【发布时间】:2017-09-30 03:45:25
【问题描述】:

我正在尝试编写一个执行以下操作的函数: 假设我有一个数组:

$data = array(
    array('10','15','20','25'),
    array('Blue','Red','Green'),
    array('XL','XS')
)

我的结果数组应该是这样的:

$result = array(
    array('10','15','20','25'),
    array('Blue','Red','Green','Blue','Red','Green','Blue','Red','Green','Blue','Red','Green')
    array('XL','XS','XL','XS','XL','XS','XL','XS','XL','XS','XL','XS','XL','XS','XL','XS','XL','XS','XL','XS','XL','XS','XL','XS','XL','XS','XL','XS','XL','XS','XL','XS','XL','XS','XL','XS','XL','XS','XL','XS','XL','XS','XL','XS','XL','XS','XL','XS')
)

我坚持这一点,因为我想要一个能够做到这一点的函数,无论第一个数组中有多少数组$data

我只能写这个,这就是给$result数组的原因:

foreach($data[2] as $value2){
    $result[2][] = $value2;
    foreach($data[1] as $value1){
        $result[1][] = $value1;
        foreach($data[0] as $value0){
            $result[0][] = $value0;
        }
    }
}

经过一些研究,似乎递归函数是动态生成那些foreach 的方法,但我无法让它工作。

感谢您的帮助。

【问题讨论】:

    标签: php arrays dynamic foreach


    【解决方案1】:

    这是动态的:

    $result[] = array_shift($data);
    
    foreach($data as $value) {
        $result[] = call_user_func_array('array_merge',
                                         array_fill(0, count($result[0]), $value));
    }
    
    • 从原始元素中获取并删除第一个元素
    • 循环剩余元素并用第一个元素中的 X 个值填充结果
    • 由于元素是数组,因此将它们全部合并到结果中

    如果不需要修改原件,则使用此方法:

    $result[] = reset($data);
    
    while($value = next($data)) {
        $result[] = call_user_func_array('array_merge',
                                         array_fill(0, count($result[0]), $value));
    }
    

    【讨论】:

    • Notice: Undefined variable: result in /tmp/execpad-f98c9926d5ea/source-f98c9926d5ea on line 15 Warning: array_merge() expects at least 1 parameter, 0 given in /tmp/execpad-f98c9926d5ea/source-f98c9926d5ea on line 15 Warning: array_merge() expects at least 1 parameter, 0 given in /tmp/execpad-f98c9926d5ea/source-f98c9926d5ea on line 15
    • 是的,现在我没事了
    • 嗯,这正是我想要实现的目标,只是我需要使用count($result[$key]) 而不是count($result[0])!非常感谢:)
    【解决方案2】:

    只需使用 array_fill 和 array_merge 函数

    $result = array(
      $data[0],
      array_merge(...array_fill(0,count($data[0]), $data[1])),
      array_merge(...array_fill(0,count($data[0])*count($data[0]), $data[2]))
      );
    print_r($result); 
    

    demo on eval.in

    【讨论】:

    • 您的解决方案效果很好,但是当我不知道$data 中的元素数量时,我不知道如何继续使用您的答案。 AbraCadaver 答案在函数中似乎更灵活易用,但感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 2010-12-11
    • 2012-08-04
    相关资源
    最近更新 更多