Оптимизация кода PHP с двумя циклами foreach

У меня есть массив, состоящий из ключей:

$countries = ['EU', 'UK', 'Asia'];  

Другой массив, который состоит из дополнительных элементов на основе этих ключей:

$countries_array=['UK'=>['London', 'Birmingham', 'Manchester'], 'EU'=> ['Germany','Netherlands'] , 'Asia'=> ['Pakistan','Bangladesh','China']];

$mid_countries[];

Я хочу пройти через все элементы, проверить, пусты они или нет, а затем создать еще один массив. Я написал код, и он отлично работает. Но у него есть петли foreach. Есть ли способ оптимизировать этот код?

foreach ($countries as $each_country) {
    if (!empty($countries_array["$each_country"][0])) {
        foreach ($countries_array["$each_country"] as $value) {
            $mid_countries[] = array("wildcard" => array("$each_country" => $value. "*"));
        }
    }
}

Ожидаемый результат:

    array(8) { 
[0]=> array(1) { ["wildcard"]=> array(1) { ["EU"]=> string(8) "Germany*" } } [1]=> array(1) { ["wildcard"]=> array(1) { ["EU"]=> string(12) "Netherlands*"}} 
[2]=> array(1) { ["wildcard"]=> array(1) { ["UK"]=> string(7) "London*" } } [3]=> array(1) { ["wildcard"]=> array(1) { ["UK"]=> string(11) "Birmingham*" } } [4]=> array(1) { ["wildcard"]=> array(1) { ["UK"]=> string(11) "Manchester*" } } [5]=> array(1) { ["wildcard"]=> array(1) { ["Asia"]=> string(9) "Pakistan*" } } [6]=> array(1) { ["wildcard"]=> array(1) { ["Asia"]=> string(11) "Bangladesh*"}} 
[7]=> array(1) { ["wildcard"]=> array(1) { ["Asia"]=> string(6) "China*" } } }

Ваш $countries_array содержит синтаксические ошибки.

Raptor 05.12.2018 11:27

Каков ваш ожидаемый результат?

Nigel Ren 05.12.2018 11:27

Ваш код не должен работать.

AnTrakS 05.12.2018 11:29

Вероятно, вам вообще не понадобится второй цикл foreach, если вы расскажете нам, как вы в дальнейшем будете использовать $mid_countries. Сейчас я не вижу даже первого.

nice_dev 05.12.2018 11:31

@ vivek_23 Это новый массив, который мне нужно использовать в другой функции PHP.

Marium Malik 05.12.2018 11:32

@MariumMalik Хорошо, но как бы вы использовали его дальше? Это поиск для получения формата подстановочного знака?

nice_dev 05.12.2018 11:33

@ vivek_23 Это для моего эластичного поискового запроса.

Marium Malik 05.12.2018 11:33

То, что вы показали, не имеет смысла. Помимо синтаксических ошибок, использование таких вещей, как ['UK'] в качестве ключа (который сам по себе является множество, содержащим один строковый элемент), должно дать вам Предупреждение: недопустимый тип смещения

misorude 05.12.2018 11:35

@MariumMalik Например, если кто-то будет искать London, что вы им покажете?

nice_dev 05.12.2018 11:36

@misorude Я только что привел вам пример. Это не мои настоящие данные.

Marium Malik 05.12.2018 11:37

Речь идет не о данные (содержании), а о структура. Это даже не имеет смысла в качестве примера. Если приводите примеры, то хоть структурно верните их, пожалуйста.

misorude 05.12.2018 11:40

@misorude По поводу вашего первого комментария, мои данные на самом деле похожи, и он работает. PHP не выдает никаких ошибок недопустимого типа смещения.

Marium Malik 05.12.2018 11:43

@Raptor Я исправил это, отсутствовала закрывающая скобка.

Marium Malik 05.12.2018 11:46

Честно говоря, я думаю, что это самый простой (и, вероятно, самый быстрый) способ сделать это сейчас. Вы можете использовать некоторые функции array_, но это довольно простой процесс.

Nigel Ren 05.12.2018 11:46

@NigelRen Хорошо! Спасибо! Это то, что я действительно хотел знать. Мне было интересно, могу ли я избежать первого foreach.

Marium Malik 05.12.2018 11:50
«Мои данные на самом деле похожи, и они работают. PHP не выдает никаких ошибок недопустимого типа смещения » - тогда ваши данные нет фактически относятся к этой структуре, или у вас настроен PHP, чтобы не отображать такие ошибки. И это тоже может не работать, если вы действительно используете ['UK'] как ключ. $foo = [['bar'] => 'baz']; var_dump($foo); выдаст вам указанное предупреждение и в результате получит полностью пустой массив (такой ключ так как недействителен).
misorude 05.12.2018 11:54

Каков ожидаемый результат?

Andreas 05.12.2018 12:03

@Andreas Ожидаемый результат - массив $ mid_countries с подстановочным знаком в качестве ключа и каждой страны в качестве значения вместе с '*'

Marium Malik 05.12.2018 12:06

@misorude Я поставил лишние квадратные скобки. Это была ошибка с моей стороны.

Marium Malik 05.12.2018 12:07

@NigelRen Добавил вывод

Marium Malik 05.12.2018 12:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
20
149
1

Ответы 1

Я думаю, вы этого ожидали (обновленный код использует его работу в одном цикле)

foreach ($countries_array as $key=>$value) {         
   $tmp=implode('*#'.$key.'#',$value);
   $tmp='#'.$key.'#'.$tmp."*";
   $tmp=str_replace('#'.$key.'#',"\"}},{\"wildcard\":{\"".$key."\":\"",$tmp);
   $result=$result.substr($tmp,3)."\"}}"; 
}
$result = "[".ltrim($result,"\"}},")."]";
$result=json_decode($result,true);
print_r($result);

Я получаю уведомление о преобразовании массива в строку для первой строки.

Marium Malik 05.12.2018 11:42

ожидаемый результат?

Sabash 05.12.2018 12:11

приведи мне примеры?

Sabash 05.12.2018 12:22

Добавил в вопрос

Marium Malik 05.12.2018 12:27

Другие вопросы по теме