web-dev-qa-db-ja.com

PHP foreach with Nested Array?

結果のサブセットを表示するネストされた配列があります。たとえば、下の配列では、ネストされたarray [1]のすべての値をループしたいと思います。

 Array 
(
 [0] => Array 
(
 [0] => one 
 [1] =>配列
(
 [0] => 1 
 [1] => 2 
 [2] => 3 
)
)
 
 [1] =>配列
(
 [0] => two 
 [1] =>配列
(
 [0] => 4 
 [1] => 5 
 [2] => 6 
)
)
 
 [2] =>配列
(
 [0] => three 
 [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($ valueとしての$ tmpArray [1]){
 echo $ value; 
} 

キーが検索したいキーと同じかどうか、つまり、変数の比較を避けようとしていました。

 foreach($ key => $ valueとしての$ tmpArray){
 if($ key == 1){
 echo $ value; 
} 
} 

何か案は?

36
noangel

ネストされた配列のレベル数がわかっている場合は、ネストされたループを実行できます。そのようです:

//  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";
        }
    }
}
59
Alex
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
Pratik Sawant

両方の構文が正しいです。しかし、結果はArrayになります。おそらく次のようなことをしたいでしょう:

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

これにより、文字列 "two"($ value [0])と配列の整数4、5、6($ value [1])が出力されます。

2
2ndkauboy

このデータはどうですか:

[0] => Array (
    [item] => null
    [count] => 0
    [child] => Array (
        [1] => Array (
            [item] => 1
            [count] => 6
            [child] => Array (
                [5] => Array (
                    [item] => 5
                    [count] => 3
                    [child] => Array (
                        [4] => Array (
                            [item] => 4
                            [count] => 1
                            )
                        )
                    )
                [3] => Array (
                    [item] => 3
                    [count] => 2
                    [child] => Array (
                        [4] => Array (
                            [item] => 4
                            [count] => 1
                            )
                        )
                    )
                )
            )
        [3] => Array (
            [item] => 3
            [count] => 1
            [child] => Array (
                [4] => Array (
                    [item] => 4
                    [count] => 1
                    )
                )
            )
        )
    )

すべての経路を取得できますか?データはバイナリツリーのように見えます。助けが要る

0
mario caseres