【问题标题】:PHP foreach with Nested Array?PHP foreach 与嵌套数组?
【发布时间】:2011-04-10 17:06:09
【问题描述】:

我有一个嵌套数组,我想在其中显示结果的子集。例如,在下面的数组中,我想遍历嵌套数组[1] 中的所有值。

大批 ( [0] => 数组 ( [0] => 一 [1] => 数组 ( [0] => 1 [1] => 2 [2] => 3 ) ) [1] => 数组 ( [0] => 两个 [1] => 数组 ( [0] => 4 [1] => 5 [2] => 6 ) ) [2] => 数组 ( [0] => 三 [1] => 数组 ( [0] => 7 [1] => 8 [2] => 9 ) ) )

我试图使用 foreach 函数,但我似乎无法让它工作。这是我原来的语法(虽然我意识到这是错误的)。

$tmpArray = array(array("one",array(1,2,3)),array("two",array(4,5,6)),array("three",array(7,8,9 ))); foreach ($tmpArray[1] as $value) { 回声$值; }

我试图避免变量比较键是否与我要搜索的键相同,即

foreach ($tmpArray as $key => $value) { 如果 ($key == 1) { 回声$值; } }

有什么想法吗?

【问题讨论】:

  • 您的初始语法似乎没问题,但$value 可以是foreach 中的数组本身。在这种情况下,您不能只是回显它,还需要循环遍历它。

标签: php arrays foreach nested


【解决方案1】:

如果您知道嵌套数组中的层数,则可以简单地进行嵌套循环。像这样:

//  Scan through outer loop
foreach ($tmpArray as $innerArray) {
    //  Check type
    if (is_array($innerArray)){
        //  Scan through inner loop
        foreach ($innerArray as $value) {
            echo $value;
        }
    }else{
        // one, two, three
        echo $innerArray;
    }
}

如果你不知道你需要使用递归的数组的深度。请参见下面的示例:

//  Multi-dementional Source Array
$tmpArray = array(
    array("one", array(1, 2, 3)),
    array("two", array(4, 5, 6)),
    array("three", array(
            7,
            8,
            array("four", 9, 10)
    ))
);

//  Output array
displayArrayRecursively($tmpArray);

/**
 * Recursive function to display members of array with indentation
 *
 * @param array $arr Array to process
 * @param string $indent indentation string
 */
function displayArrayRecursively($arr, $indent='') {
    if ($arr) {
        foreach ($arr as $value) {
            if (is_array($value)) {
                //
                displayArrayRecursively($value, $indent . '--');
            } else {
                //  Output
                echo "$indent $value \n";
            }
        }
    }
}

下面的代码仅显示嵌套数组,其中包含特定情况的值(仅限第 3 级)

$tmpArray = array(
    array("one", array(1, 2, 3)),
    array("two", array(4, 5, 6)),
    array("three", array(7, 8, 9))
);

//  Scan through outer loop
foreach ($tmpArray as $inner) {

    //  Check type
    if (is_array($inner)) {
        //  Scan through inner loop
        foreach ($inner[1] as $value) {
           echo "$value \n";
        }
    }
}

【讨论】:

  • 我想你可能错过了我的意思,我只想显示一个特定的嵌套/子数组,而不是全部。
  • @noangel 误会见谅,请看水平尺后修改后的帖子(最后一部分)。这应该澄清一些事情。
  • 我尝试了你的递归数组输出实现,虽然它适用于第一级,但我最后一个嵌套数组只是在一行上输出
【解决方案2】:
foreach ($tmpArray as $innerArray) {
    //  Check type
    if (is_array($innerArray)){
        //  Scan through inner loop
        foreach ($innerArray as $value) {
            echo $value;
        }
    }else{
        // one, two, three
        echo $innerArray;
    }
}

【讨论】:

    【解决方案3】:

    两种语法都是正确的。但结果将是Array。你可能想做这样的事情:

    foreach ($tmpArray[1] as $value) {
      echo $value[0];
      foreach($value[1] as $val){
        echo $val;
      }
    }
    

    这将打印出字符串 "two" ($value[0]) 和数组 ($value[1]) 中的整数 4、5 和 6。

    【讨论】:

    • 我只收到错误:警告:为 foreach() 提供的参数无效
    【解决方案4】:

    据我了解,之前的所有答案都不会产生数组输出, 就我而言: 我有一个具有父子结构的模型(此处为简化代码):

    public function parent(){
    
        return $this->belongsTo('App\Models\Accounting\accounting_coding', 'parent_id');
    }
    
    
    public function children()
    {
    
        return $this->hasMany('App\Models\Accounting\accounting_coding', 'parent_id');
    }
    

    如果您想将所有子 ID 作为一个数组,这种方法很好并且对我有用:

    public function allChildren()
    {
        $allChildren = [];
        if ($this->has_branch) {
    
            foreach ($this->children as $child) {
    
                $subChildren = $child->allChildren();
    
                if (count($subChildren) == 1) {
                    $allChildren  [] = $subChildren[0];
                } else if (count($subChildren) > 1) {
                    $allChildren += $subChildren;
                }
            }
        }
        $allChildren  [] = $this->id;//adds self Id to children Id list
    
        return $allChildren; 
    }
    

    allChildren() 将所有的孩子作为一个简单的数组返回。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-01
      • 2016-07-25
      • 2016-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多