如何使用array_search()获取多个键?

时间:2018-06-12 16:48:25

标签: php arrays

我想从$ 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"),我无法获得这两个数据。如何获得多个匹配结果?

3 个答案:

答案 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"]));

https://3v4l.org/pIQbZ