it-swarm.com.ru

PHP foreach с вложенным массивом?

У меня есть вложенный массив, в котором я хочу отобразить подмножество результатов. Например, в приведенном ниже массиве я хочу просмотреть все значения во вложенном массиве [1].

 Array 
 (
 [0] => Array 
 (
 [0] => one 
 [1] => Array 
 (
 [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 (массив («один», массив (1,2,3)), массив («два», массив (4,5,6)), массив («три», массив (7, 8,9))); 

 Foreach ($ tmpArray [1] как $ value) {
 echo $ value; 
} 

Я пытался избежать сравнения переменных на предмет того, совпадает ли ключ с ключом, который я хочу найти, т.е.

 foreach ($ tmpArray as $ key => $ value) {
 if ($ key == 1) {
 echo $ value; 
 } 
} 

Есть идеи?

34
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";
        }
    }
}
56
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;
  }
}

Это выведет строку «два» ($ 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