我想从$ 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()
方法只返回第一个匹配。如果有两个具有相同网址的数组(例如"/register"
),我无法获得这两个数据。如何获得多个匹配结果?
答案 0 :(得分:5)
在array_search
手册中提到:
要返回所有匹配值的键,请使用带有可选
array_keys()
参数的search_value
。
所以,而不是
$key = array_search($needle, array_column($haystack, $column));
使用
$keys = array_keys(array_column($haystack, $column), $needle); // notice order of arguments
答案 1 :(得分:3)
使用foreach
循环的无聊解决方案:
function get_in_array( string $needle, array $haystack, string $column){
$matches = [];
foreach( $haystack as $item ) if( $item[ $column ] === $needle ) $matches[] = $item;
return $matches;
}
使用array_filter
:
function get_in_array( string $needle, array $haystack, string $column ){
return array_filter( $haystack, function( $item )use( $needle, $column ){
return $item[ $column ] === $needle;
});
}
答案 2 :(得分:0)
您可以使用array_intersect和array_column 这首先找到“寄存器”项,并通过键将它们与实际数组匹配。
$register = array_intersect_key($arr, array_intersect(array_column($arr, "url"), ["/register"]));