Как получить определенные значения из многомерных массивов?

#php

#php

Вопрос:

Вот данные, с которыми я работаю прямо сейчас:

     $city = [
        [
            "name" => "Dhaka",
            "areas" => ["d1", "d2", "d3"]
        ],
        [
            "name" => "Chittagong",
            "areas" => ["c1", "c2", "c3"]
        ],
        [
            "name" => "Sylhet",
            "areas" => ["s1", "s2", "s3"]
        ],
        [
            "name" => "Barisal",
            "areas" => ["b1", "b2", "b3"]
        ],
        [
            "name" => "Khulna",
            "areas" => ["k1", "k2", "k3"]
        ],
        [
            "name" => "Rajshahi",
            "areas" => ["r1", "r2", "r3"]
        ],
    ];
  

Я хотел бы получить список данных, связанных только с ключом «name».

Я также хотел бы показать данные, связанные с ключом «area», как только пользователь перейдет к соответствующему «name».

Было бы полезно, если бы были какие-либо предложения о том, как лучше хранить эти данные для частого использования в коде.

Комментарии:

1. Чего именно вы ожидаете? Ввод и вывод?

Ответ №1:

Пока имена уникальны, вы можете выполнить этот простой трюк:

Пример 1

 $city = [
    [
        "name" => "Dhaka",
        "areas" => ["d1", "d2", "d3"]
    ],
    [
        "name" => "Chittagong",
        "areas" => ["c1", "c2", "c3"]
    ],
    [
        "name" => "Sylhet",
        "areas" => ["s1", "s2", "s3"]
    ],
    [
        "name" => "Barisal",
        "areas" => ["b1", "b2", "b3"]
    ],
    [
        "name" => "Khulna",
        "areas" => ["k1", "k2", "k3"]
    ],
    [
        "name" => "Rajshahi",
        "areas" => ["r1", "r2", "r3"]
    ],
];    

$names = array_column($city, null, 'name');

print_r($names);
  

Вывод

 Array
(
    [Dhaka] => Array
        (
            [name] => Dhaka
            [areas] => Array
                (
                    [0] => d1
                    [1] => d2
                    [2] => d3
                )

        )

    [Chittagong] => Array
        (
            [name] => Chittagong
            [areas] => Array
                (
                    [0] => c1
                    [1] => c2
                    [2] => c3
                )

        )

    [Sylhet] => Array
        (
            [name] => Sylhet
            [areas] => Array
                (
                    [0] => s1
                    [1] => s2
                    [2] => s3
                )

        )

    [Barisal] => Array
        (
            [name] => Barisal
            [areas] => Array
                (
                    [0] => b1
                    [1] => b2
                    [2] => b3
                )

        )

    [Khulna] => Array
        (
            [name] => Khulna
            [areas] => Array
                (
                    [0] => k1
                    [1] => k2
                    [2] => k3
                )

        )

    [Rajshahi] => Array
        (
            [name] => Rajshahi
            [areas] => Array
                (
                    [0] => r1
                    [1] => r2
                    [2] => r3
                )

        )

)
  

Теперь вы можете выполнять поиск по имени

 print_r($city['Chittagong']['areas']); //["c1", "c2", "c3"]
  

Если не гарантируется, что имена уникальны, вам придется создавать их с помощью foreach, вот так:

Пример 2

 $city = [
        [
            "name" => "Dhaka",
            "areas" => ["d1", "d2", "d3"]
        ],
        [
            "name" => "Chittagong",
            "areas" => ["c1", "c2", "c3"]
        ],
         [ /*--- ADDED to show duplication ---- */
            "name" => "Chittagong",
            "areas" => ["x1", "x2", "x3"]
        ],
        [
            "name" => "Sylhet",
            "areas" => ["s1", "s2", "s3"]
        ],
        [
            "name" => "Barisal",
            "areas" => ["b1", "b2", "b3"]
        ],
        [
            "name" => "Khulna",
            "areas" => ["k1", "k2", "k3"]
        ],
        [
            "name" => "Rajshahi",
            "areas" => ["r1", "r2", "r3"]
        ],
    ];


$output = [];

foreach($city as $k=>$v){
    $k = $v['name'];
    if(!isset($output[$k])) $output[$k] = []; //initialize

    $output[$k][] = $v;
}

print_r($output);
  

Что даст вам что-то вроде этого:

 Array
(
    [Dhaka] => Array
        (
            [0] => Array
                (
                    [name] => Dhaka
                    [areas] => Array
                        (
                            [0] => d1
                            [1] => d2
                            [2] => d3
                        )

                )

        )

    [Chittagong] => Array
        (
            [0] => Array
                (
                    [name] => Chittagong
                    [areas] => Array
                        (
                            [0] => c1
                            [1] => c2
                            [2] => c3
                        )

                )

            [1] => Array
                (
                    [name] => Chittagong
                    [areas] => Array
                        (
                            [0] => x1
                            [1] => x2
                            [2] => x3
                        )

                )

        )

    [Sylhet] => Array( ... )
  

Как вы можете видеть, это добавляет дополнительный уровень, чтобы содержать множественные вхождения. Конечно, вы могли бы просто объединить area при дублировании (в foreach). Но это зависит от вас.

Вот краткий пример этого (те же данные, что и выше):

Пример 3

 $output = [];

foreach($city as $k=>$v){
    $k = $v['name'];
    if(!isset($output[$k])) $output[$k] = []; //initialize

    $output[$k] = array_merge($output[$k], $v['areas']); //merge the areas
}

print_r($output);
  

Вывод

 Array
(
    [Dhaka] => Array
        (
            [0] => d1
            [1] => d2
            [2] => d3
        )

    [Chittagong] => Array
        (
            [0] => c1
            [1] => c2
            [2] => c3
            [3] => x1
            [4] => x2
            [5] => x3
        )
  ....
  )
  

Если бы это был я, я бы выбрал последний, просто из-за простоты, с которой он будет работать позже.

PS. если вы извлекаете данные из базы данных с помощью PDO , вы можете использовать $stmt->fetchAll(PDO::FETCH_GROUP) , который автоматически выдаст вам что-то вроде второго примера. Единственное предостережение здесь заключается в том, что name столбец является первым, выбранным в запросе, по которому он будет группироваться.

Приветствия.

Комментарии:

1. Ваше «echo» вернет Array 🙂 но 1 за то, что это лучшее решение

Ответ №2:

Если вы просто пытаетесь перебрать список городов и получить названия, вы можете просто использовать цикл foreach. Если вам нужно что-то сверх этого, попробуйте сформулировать свой вопрос немного подробнее.

 foreach ($city as $c) {
        echo $c["name"];
    }