PHP foreach 与嵌套数组?

Posted

技术标签:

【中文标题】PHP foreach 与嵌套数组?【英文标题】:PHP foreach with Nested Array? 【发布时间】: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 中的数组本身。在这种情况下,您不能只是回显它,还需要循环遍历它。 【参考方案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() 将所有的孩子作为一个简单的数组返回。

【讨论】:

以上是关于PHP foreach 与嵌套数组?的主要内容,如果未能解决你的问题,请参考以下文章

PHP:我需要嵌套的 foreach 循环还是多个数组?

PHP如何将嵌套的foreach变成数组的数组(多维数组)

Php多维数组与混合for和Foreach循环

打印嵌套数组关联数组php

PHP嵌套foreach()给出警告:为foreach()提供的参数无效

PHP未设置嵌套数组的部分