Search code examples
phparraysforeachnested

PHP foreach with Nested Array?


I have a nested array in which I want to display a subset of results. For example, on the array below I want to loop through all the values in nested array[1].

Array
(
  [0] => Array
    (
      [0] => one
      [1] => Array
        (
          [0] => 1
          [1] => 2
          [2] => 3
        )
    )

  [1] => Array
    (
      [0] => two
      [1] => Array
        (
          [0] => 4
          [1] => 5
          [2] => 6
        )
    )

  [2] => Array
    (
      [0] => three
      [1] => Array
        (
          [0] => 7
          [1] => 8
          [2] => 9
        )
    )
)

I was trying to use the foreach function but I cannot seem to get this to work. This was my original syntax (though I realise it is wrong).

$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) {
  echo $value;
}

I was trying to avoid a variable compare on whether the key is the same as the key I want to search, i.e.

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

Any ideas?


Solution

  • If you know the number of levels in nested arrays you can simply do nested loops. Like so:

    //  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;
        }
    }
    

    if you do not know the depth of array you need to use recursion. See example below:

    //  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";
                }
            }
        }
    }
    

    The code below with display only nested array with values for your specific case (3rd level only)

    $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";
            }
        }
    }