У меня многомерный массив. Ключи отдельных массивов - это текст. Я хотел бы знать, как сопоставить ключ с частью строки, которая из зацикленных данных SELECT.
Пример массива
Array ( [Volvo] => Array ( [0] => )
[Ford] => Array ( [0] => )
[Seat] => Array ( [0] => ) )
Итак, из этого массива $cars
, как я мог бы сопоставлять данные, поступающие из моего запроса SELECT
Выберите Output echo $row['car'];
Volvo, Mercedes, Lexus
Что я после
если ключ одного из моих массивов соответствует части строки из моего запроса выбора, так как пример говорит выше, что Volvo будет соответствовать, тогда сделайте что-нибудь. Это что-то для меня добавляет больше данных в этот массив.
Я попытался вариация in_array
, array_search
и array_filter
, но не нашел решение, которое работает для меня.
Пример обратного тому, что я делал через цикл foreach
$searchword = $array_element;
$result = array_filter($cars, function($var) use ($searchword) { return preg_match("/\b$searchword\b/i", $var); });
Это должно сработать для вас:
Сначала я использовал preg_split()
чтобы разбить строку поиска (Volvo, Mercedes, Lexus
) на массив.
Регулярное выражение:
/\s*,\s*/
Просто означает:
Это гарантирует, что у нас нет пробелов в словах поиска из вашей строки. Таким образом, мы получим такой массив:
Array
(
[0] => Volvo
[1] => Mercedes
[2] => Lexus
)
После этого я просто возьму array_intersect_key()
из вашего массива и массив поиска, который мы только что создали.
Код:
<?php
$arr = preg_split("/\s*,\s*/", $row["car"], -1, PREG_SPLIT_NO_EMPTY);
if(($intersect = array_intersect_key($cars, array_flip($arr)))) {
echo "Do stuff!";
print_r($intersect);
} else {
echo "Drink a cup of tea";
}
?>
вывод:
Array
(
[Volvo] => Array
(
[0] =>
)
)
Попробуйте использовать PHP stripos
, это просто и эффективно:
Базовые данные:
$array = Array ( [Volvo] => Array ( [0] => )
[Ford] => Array ( [0] => )
[Seat] => Array ( [0] => ) )
;
SQL-данные (строка или массив):
$row['car']; // string
$row //array of all SQL columns output
Foreach
с stripos
:
foreach($array as $rowKey=>$rowArray){
$rowKey = trim($rowKey);
foreach($row as $sqlRow=>$sqlArray){
$sqlRow = trim($sqlRow);
if (stripos($rowKey,$sqlRow) !== false){
///values are the same in this key in the array and in the SQL output
}
}
unset($sqlRow,$sqlArray);
}
unset($rowKey,$rowArray);
Это может быть не самым эффективным, но должно дать вам результат, который вы хотите
Есть много способов достижения вашей цели. Я бы использовал функцию explode()
для разделения данных, полученных из базы данных ($row['car']
) на куски и trim()
чтобы убедиться, что идентифицированные части не имеют пробелов:
$brands = array_map('trim', explode(',', $row['car']));
Теперь print_r($brands)
должен показать массив, значения которого являются ключами-кандидатами в вашем массиве примеров ($example
ниже).
Далее это зависит от того, что вы хотите сопоставить, и как вы хотите обработать матчи.
Простую идентификацию можно выполнить с помощью array_intersect()
с $brands
и ключами массива example (см. Функцию array_keys()
).
$common = array_intersect($brands, array_keys($example));
foreach ($common as $key) {
// Do something with $example[$key]
}
Или вы можете перебирать напрямую через $brands
и проверять, является ли значение ключом в $example
:
foreach ($brands as $key) {
if (array_key_exists($key, $example)) {
// Do something with $example[$key]
}
}
Вы можете использовать isset($example[$key])
, а не array_key_exists($key, $example])
.