0

I have a simple array of data, and I would like to make it multidimensional. To keep things simple, I've written below an array that reflects what I've got, and another that reflects how it should be.

The problem is I don't know the keys like 'europe' or 'france', or 'paris'.

I need to determine if the continent is a new key, so I make an array with it. Same with the countries, then cities etc.

I have this :

Array
(
    [0] => Array
        (
            [continent]     => europe
            [country]       => france
            [city]          => paris
            [monument]      => tour eiffel
        )

    [1] => Array
        (
            [continent]     => europe
            [country]       => england
            [city]          => london
            [monument]      => big ben
        )

    [2] => Array
        (
            [continent]     => australia
            [country]       => australia
            [city]          => sydney
            [monument]      => opera
        )

    [3] => Array
        (
            [continent]     => america
            [country]       => usa
            [city]          => new york
            [monument]      => empire state building 
        )

    [4] => Array
        (
            [continent]     => america
            [country]       => usa
            [city]          => new york
            [monument]      => statue of liberty 
        )
)

I need that :

Array
(
    [0] => Array (
        [europe] => Array (
            [france] => Array (
                [paris] => Array (
                    [0] => eiffel tower
                )
            )
            [england] => Array (
                [london] => Array (
                    [0] => big ben
                )
            )
        )   
        [australia] => Array (
            [australia] => Array (
                [sydney] => Array (
                    [0] => opera
                )
            )
        )
        [america] => Array (
            [usa] => Array (
                [new york] => Array (
                    [0] => empire state building
                    [1] => statue of liberty
                )
            )
        )
    )
)

Any ideas ?

3
  • 2
    Just loop through them and generate the array. Commented Jun 10, 2015 at 12:05
  • 1
    I don't think "simplify" means what you think it means... Commented Jun 10, 2015 at 12:11
  • @b0s3 yes, that's precisely what I'm asking help for... Commented Jun 10, 2015 at 12:38

2 Answers 2

3

Use a loop -

$new = array();

foreach($array as $data) {
    $new['continents'][$data['continent']][$data['country']][$data['city']][] = $data['monument']; 
}

Output

array(1) {
  ["continents"]=>
  array(3) {
    ["europe"]=>
    array(2) {
      ["france"]=>
      array(1) {
        ["paris"]=>
        string(11) "tour eiffel"
      }
      ["england"]=>
      array(1) {
        ["london"]=>
        string(7) "big ben"
      }
    }
    ["australia"]=>
    array(1) {
      ["australia"]=>
      array(1) {
        ["sydney"]=>
        string(5) "opera"
      }
    }
    ["america"]=>
    array(1) {
      ["usa"]=>
      array(1) {
        ["new york"]=>
        string(17) "statue of liberty"
      }
    }
  }
}
Sign up to request clarification or add additional context in comments.

2 Comments

I can't use that as I don't know the keys. I've edited my question.
It will not affect. You dont know the values but the keys(continent, country, city, monument) will be fixed. Work for them also.
0

This one should work, it really reads bad...

$target = array();
foreach($source as $item) {
    //add continent
    if (!array_key_exists($item['continent'], $target) 
        $target[$item['continent']] = array();
    //add country
    if (!array_key_exists($item['country'], $target[$item['continent']]) 
        $target[$item['continent']][$item['country']] = array();
    //add city
    if (!array_key_exists($item['city'], $target[$item['continent']][$item['country']]) 
        $target[$item['continent']][$item['country']][$item['city']] = array();
    //add the monument string to the city array
    $target[$item['continent']][$item['country']][$item['city']][] = $item['monument'];
}

Any suggestions regarding creating the sub arrays or a more simple build of the array?

You may read your new array like this:

foreach ($target as $continent => $con_arr)
    foreach ($con_arr as $country => $cou_arr)
        foreach ($cou_arr as $city=> $cit_arr)
            foreach ($cou_arr as $monument)
                print $continent . $country . $city . $monument;

2 Comments

I can't use that as I don't know the keys. I've edited my question.
'europe' or 'france', or 'paris' are not keys, they are values. This will buid it as you want. If you have problems to read the new array out, I'd understand your remark, please explain it a bit more in your upper question.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.