Я хочу получить маршруты совпадений из массива $ routes. если существует несколько массивов с одинаковым значением ur. Я хочу получить их все.
обычный элемент массива выглядит так;
[
"controller" => "RegisterController",
"method" => "GET",
"url" => "/register",
"action" => "index"
]
Я получаю элемент с помощью метода get_in_array;
$routes = unserialize(apcu_fetch("routes"));
$route = get_in_array($this->url, $routes, "url");
помощник
function get_in_array(string $needle,array $haystack,string $column){
$key = array_search($needle, array_column($haystack, $column));
// even if there are more than one same url, array search returns first one
if (!is_bool($key)){
return $haystack[$key];
}
}
Но метод array_search() возвращает только первое совпадение. если есть два массива с одинаковым URL-адресом (например, "/register"), я не могу получить их оба. как мне получить более одного совпадающего результата?
но если есть много маршрутов, это может снизить производительность приложения?
Я не знаю, но array_column каждый раз должен создавать новый массив, что также требует много времени.






В руководстве array_search есть упоминание:
To return the keys for all matching values, use
array_keys()with the optionalsearch_valueparameter instead.
Итак, вместо
$key = array_search($needle, array_column($haystack, $column));
использовать
$keys = array_keys(array_column($haystack, $column), $needle); // notice order of arguments
это работает :) большое спасибо. можно спросить ? есть ли простой способ получить эти совпадающие предметы?
Разве это не легко? Конечно, вы можете просто перебрать $haystack и проверить значение поля. Но если у вас нет действительно огромного количества элементов в $haystack, вы не заметите разницы.
Но если вам нужны не ключи, а значения - тогда следуйте ответу @biziclop с фильтрацией. Это более понятно.
на самом деле, это то, что я задаю в вопросе, но, как вы упомянули, @biziclop ответьте, что мне нужно
Вы можете использовать array_intersect и array_column.
Сначала он находит "регистровые" элементы и сопоставляет их с реальным массивом по ключам.
$register = array_intersect_key($arr, array_intersect(array_column($arr, "url"), ["/register"]));
Скучное решение с использованием петли foreach:
function get_in_array( string $needle, array $haystack, string $column){
$matches = [];
foreach( $haystack as $item ) if ( $item[ $column ] === $needle ) $matches[] = $item;
return $matches;
}
function get_in_array( string $needle, array $haystack, string $column ){
return array_filter( $haystack, function( $item )use( $needle, $column ){
return $item[ $column ] === $needle;
});
}
$matches[] = $item Полагаю.
В этом случае, возможно, вы могли бы использовать простой цикл
foreachи поместить совпадения в массив и быть счастливым.