У меня есть массив, состоящий из ключей:
$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*" } } }
Каков ваш ожидаемый результат?
Ваш код не должен работать.
Вероятно, вам вообще не понадобится второй цикл foreach, если вы расскажете нам, как вы в дальнейшем будете использовать $mid_countries. Сейчас я не вижу даже первого.
@ vivek_23 Это новый массив, который мне нужно использовать в другой функции PHP.
@MariumMalik Хорошо, но как бы вы использовали его дальше? Это поиск для получения формата подстановочного знака?
@ vivek_23 Это для моего эластичного поискового запроса.
То, что вы показали, не имеет смысла. Помимо синтаксических ошибок, использование таких вещей, как ['UK'] в качестве ключа (который сам по себе является множество, содержащим один строковый элемент), должно дать вам Предупреждение: недопустимый тип смещения…
@MariumMalik Например, если кто-то будет искать London, что вы им покажете?
@misorude Я только что привел вам пример. Это не мои настоящие данные.
Речь идет не о данные (содержании), а о структура. Это даже не имеет смысла в качестве примера. Если приводите примеры, то хоть структурно верните их, пожалуйста.
@misorude По поводу вашего первого комментария, мои данные на самом деле похожи, и он работает. PHP не выдает никаких ошибок недопустимого типа смещения.
@Raptor Я исправил это, отсутствовала закрывающая скобка.
Честно говоря, я думаю, что это самый простой (и, вероятно, самый быстрый) способ сделать это сейчас. Вы можете использовать некоторые функции array_, но это довольно простой процесс.
@NigelRen Хорошо! Спасибо! Это то, что я действительно хотел знать. Мне было интересно, могу ли я избежать первого foreach.
['UK'] как ключ. $foo = [['bar'] => 'baz']; var_dump($foo); выдаст вам указанное предупреждение и в результате получит полностью пустой массив (такой ключ так как недействителен).
Каков ожидаемый результат?
@Andreas Ожидаемый результат - массив $ mid_countries с подстановочным знаком в качестве ключа и каждой страны в качестве значения вместе с '*'
@misorude Я поставил лишние квадратные скобки. Это была ошибка с моей стороны.
@NigelRen Добавил вывод






Я думаю, вы этого ожидали (обновленный код использует его работу в одном цикле)
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);
Я получаю уведомление о преобразовании массива в строку для первой строки.
ожидаемый результат?
приведи мне примеры?
Добавил в вопрос
Ваш
$countries_arrayсодержит синтаксические ошибки.