简体   繁体   中英

How can I simplify my PHP array

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 ?

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

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;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM