代码之家  ›  专栏  ›  技术社区  ›  Rupert Madden-Abbott

简化可以是平面或多维数组的循环

  •  0
  • Rupert Madden-Abbott  · 技术社区  · 15 年前

    通常,我会有一个数组,其中包含一组需要处理的值。有时,数组只保存一个集合,在这种情况下,每个值都需要经过处理。其他时候,数组将包含多个集合,在这种情况下,每个值将是一个数组,并且需要处理这些数组的每个值。下面是一个例子:

    foreach($array as $key => $value) {
        if(is_array($value)) {
            foreach($value as $subkey => $subvalue) {
                //Process $subvalue here    
            }
        }
        else {
            //Process $value here
        }
    }
    

    问题是用于处理$value/$subvalue的代码是相同的,只是它在不同的变量上操作。简化这一过程的一种方法是将代码放入一个函数中,但似乎不必调用两次。此外,这会在函数之外留下大量的代码(foreach循环和数组测试)。例如,假设流程是验证,我不想在调用验证函数时编写两个foreach循环和一个数组测试。

    有更简单的方法吗?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Tatu Ulmanen    15 年前

    将单个值包装到一个数组中,然后像往常一样继续:

    foreach($array as $key => $value) {
    
        if(!is_array($value)) $value = array($value);
    
        foreach($value as $subkey => $subvalue) {
            //Process $value/$subvalue here    
        }
    }
    

    或者,您可以创建一个处理单个项的函数,然后从每个分支调用相同的函数。你仍然可以节省两次写这个过程。

        2
  •  2
  •   Gordon Haim Evgi    15 年前

    你可以使用 RecursiveArrayIterator 迭代数组中的值,例如

    $iterator = new RecursiveIteratorIterator(
                    new RecursiveArrayIterator($yourArray),
                    RecursiveIteratorIterator:SELF_FIRST);
    

    然后只是 foreach 超过它。进一步阅读: