0

I recently got a project where I have to create a third-dimensional array which have to be associative.

So I defined a third-dimensional array like this:

$movies = array(
    "Action" => array(
        array(
            "Title" => "Nobody",
            "Year Released" => "2021"
        ),
        array(
            "Title" => "Monster Hunter",
            "Year Released" => "2020"
        ),
        array(
            "Title" => "Tenet",
            "Year Released" => "2020"
        ),
        array(
            "Title" => "The Hitman's Bodyguard",
            "Year Released" => "2017"
        ),
        array(
            "Title" => "Wrath of Man",
            "Year Released" => "2021"
        )
    ),

    "Comedy" => array(
        array(
            "Title" => "The Hangover",
            "Year Released" => "2009"
        ),
        array(
            "Title" => "Minions",
            "Year Released" => "2015"
        ),
        array(
            "Title" => "Deadpool",
            "Year Released" => "2016"
        ),
        array(
            "Title" => "Scary Movie",
            "Year Released" => "2000"
        ),
        array(
            "Title" => "Blockers",
            "Year Released" => "2018"
        )
    )
);

And I was trying to display the genres of the movies, along with their title and the year released. However, whenever I try to get the genres, instead I get Array. Here is the code I used:

foreach ($movies as $genres) {
    echo "$genres <br>";

    while (list ($index, $array) = each ($genres)) {
        echo "Movie number: $index <br>";
    
        while (list ($k, $v) = each ($array)) {
            echo "$k - $v <br>";
        }
        echo "<br>";
    }
    echo "<br>";
}

Part of the result (On the actual page, each line are broken into four lines. It's just this website that's messing with the result.):

Array Movie number: 0 Title - Nobody Year Released - 2021

Movie number: 1 Title - Monster Hunter Year Released - 2020

Movie number: 2 Title - Tenet Year Released - 2020

Movie number: 3 Title - The Hitman's Bodyguard Year Released - 2017

Movie number: 4 Title - Wrath of Man Year Released - 2021

How do I get the name of the genres?

Jack
  • 11
  • 3

2 Answers2

0

You can use the key syntax in the for each loop

foreach ($movies as $genreName => $genres) {
    echo "$genreName <br>";

    while (list ($index, $array) = each ($genres)) {
        echo "Movie number: $index <br>";
    
        while (list ($k, $v) = each ($array)) {
            echo "$k - $v <br>";
        }
        echo "<br>";
    }
    echo "<br>";
}
Musa
  • 96,336
  • 17
  • 118
  • 137
0

Read foreach manual

There are two syntaxes for foreach

foreach (iterable_expression as $value)
    statement

foreach (iterable_expression as $key => $value)
    statement

From php.net,

The first form traverses the iterable given by iterable_expression. On each iteration, the value of the current element is assigned to $value.

The second form will additionally assign the current element's key to the $key variable on each iteration.

I would rewrite your code like this

printEach($movies);

function printEach($array) {
  echo "<br><br>";
  foreach ($array as $key => $value) {
    echo $key;
    if (is_array($value)) {
       printEach($value); // Recursive
    } else {
      echo " - ".$value."<br><br>";
    }
  }
}
Indra Kumar S
  • 2,818
  • 2
  • 16
  • 27