PHP foreach with Nested Array?

109,132

Solution 1

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

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

Solution 3

Both syntaxes are correct. But the result would be Array. You probably want to do something like this:

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

This will print out the string "two" ($value[0]) and the integers 4, 5 and 6 from the array ($value[1]).

Share:
109,132

Related videos on Youtube

noangel
Author by

noangel

Updated on April 14, 2022

Comments

  • noangel
    noangel about 2 years

    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?

    • Fanis Hatzidakis
      Fanis Hatzidakis over 13 years
      Your intial syntax seems ok, but $value can be an array itself in the foreach. In that case you can't just echo it but you need to loop through it too.
  • noangel
    noangel over 13 years
    I only get the error: Warning: Invalid argument supplied for foreach()
  • noangel
    noangel over 13 years
    I think you may have missed my point, I only want to display a specific nested/sub array, not all of them.
  • Alex
    Alex over 13 years
    @noangel sorry for misunderstanding, see revised post (the last part) after the horizontal rule. This should clarify things.
  • myol
    myol over 9 years
    I tried your recursive array output implementation and although it works for first level, my last nested array was simply output on one line
  • user18801450
    user18801450 about 2 years
    in place of index value I want to show id.
  • topsoftwarepro
    topsoftwarepro about 2 years
    Hi I think you should explain more about what you are doing so that other people can better understand, and also make sure to use the code blocks so that it is more readable.
  • Admin
    Admin about 2 years
    Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.