У меня есть настройка значения многострочного массива в существующем коде (написанном бывшим членом команды) следующим образом:

$array1['Alpha']="New York,Los Angeles,Washington";
$array1['Beta']="New York,Los Angeles,Honolulu";
$array1['Gamma']="New York,Los Angeles,Washington";
....
....
and so on....

Мне нужно, чтобы у меня было значение города (скажем, «Вашингтон»), и мне нужно получить все значения индекса массива, которые имеют Вашингтон в своем списке CSV. Таким образом, в приведенном выше случае ответ будет «Альфа» и «Гамма» (но не «Бета», поскольку он не содержит Вашингтона).

Я попробовал функцию array_search, например

echo array_search("Washington",$array1);

Но это не дает желаемого результата.

Что мне здесь не хватает, пожалуйста?

Также пробовал

$cittskarray = explode(',', $array1["Washington"]);

foreach ($array1 as $cityvalue)
{
 ;//search one by one
}

Но это длительный метод и глубокий поиск.

php
0
Aquaholic 19 Янв 2022 в 16:24
"Что я здесь упускаю, пожалуйста?" - как на самом деле работает array_search...? Руководство по цитатам: "Ищет заданное значение в массиве", но ни одно из значений вашего массива на самом деле не является Washington
 – 
CBroe
19 Янв 2022 в 16:37
- понятно. Я также пробовал использовать функцию взрыва для каждого значения массива, но код становился все длиннее и сложнее. Поэтому ищите эффективное решение. У меня возник дополнительный вопрос: что на самом деле представляет собой этот многострочный массив? Это ассоциативный хеш или что-то в соответствии со стандартом PHP?
 – 
Aquaholic
19 Янв 2022 в 17:08

3 ответа

Вы можете использовать foreach и проверить как:

  1. Вы можете преобразовать строку, разделенную запятыми, в массив и проверить, используя in_aray
  2. если это значение найдено, вы можете заполнить новый выходной массив.

См. Ниже пример

$array1['Alpha']="New York,Los Angeles,Washington";
$array1['Beta']="New York,Los Angeles,Honolulu";
$array1['Gamma']="New York,Los Angeles,Washington";

$returnData = [];
foreach ($array1 as $k => $val)
{
 $datas = explode(",",$val);
    if(in_array('Washington', $datas) ){
        $returnData[] = $k;
    }
}

print_r($returnData);

Вывод будет: [0] => Alpha [1] => Gamma

1
Devsi Odedra 19 Янв 2022 в 16:35

Я не знаю, самый ли это эффективный способ, но вы можете использовать array_filter() (doc), чтобы добиться этого.

Пример :

<?php
$array['Alpha']="New York,Los Angeles,Washington";
$array['Beta']="New York,Los Angeles,Honolulu";
$array['Gamma']="New York,Los Angeles,Washington";
$search = "Washington";

$result = array_keys(array_filter($array, function($a) use ($search) {
    return strpos($a, $search) > -1;
}));

print_r($result);

Если функция является анонимной функцией (поэтому ее можно изменить), отобразится:

Array
(
    [0] => Alpha
    [1] => Gamma
)
1
Frankich 19 Янв 2022 в 16:37

Это потому, что array_search ищет полное совпадение.

Просто зациклите массив и проверьте наличие строки поиска:

$array1['Alpha']="New York,Los Angeles,Washington";
$array1['Beta']="New York,Los Angeles,Honolulu";
$array1['Gamma']="New York,Los Angeles,Washington";

$keyword = 'Washington';

foreach ($array1 as $key => $cities)
{
   if (str_contains($cities, $keyword)) {
        echo $key . "\n";
   }
}

Примере

0
Justinas 19 Янв 2022 в 16:35