代码之家  ›  专栏  ›  技术社区  ›  Teoman Tıngır

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

  •  0
  • Teoman Tıngır  · 技术社区  · 6 年前

    我想从$routes数组中获取匹配的路由。如果有多个数组具有相同的“ur”值。我想要所有的。

    普通的数组项看起来像;

    [
       "controller" => "RegisterController",
       "method" => "GET",
       "url" => "/register",
       "action" => "index"
    ]
    

    我正在用我的get-in-u数组方法获取项目;

    $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" )我两个都拿不到。如何获得多个匹配结果?

    3 回复  |  直到 6 年前
        1
  •  3
  •   biziclop    6 年前

    使用 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
  •  6
  •   u_mulder    6 年前

    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
    
        3
  •  0
  •   Andreas    6 年前

    可以使用array_intersect和array_column。
    这首先查找“register”项,并通过键将它们与实际数组匹配。

    $register = array_intersect_key($arr, array_intersect(array_column($arr, "url"), ["/register"]));
    

    https://3v4l.org/pIQbZ