Как мне получить несколько ключей с помощью array_search ()?

Я хочу получить маршруты совпадений из массива $ 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"), я не могу получить их оба. как мне получить более одного совпадающего результата?

В этом случае, возможно, вы могли бы использовать простой цикл foreach и поместить совпадения в массив и быть счастливым.

biziclop 12.06.2018 18:52

но если есть много маршрутов, это может снизить производительность приложения?

Teoman Tıngır 12.06.2018 18:56

Я не знаю, но array_column каждый раз должен создавать новый массив, что также требует много времени.

biziclop 12.06.2018 18:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
6 138
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

В руководстве array_search есть упоминание:

To return the keys for all matching values, use array_keys() with the optional search_value parameter instead.

Итак, вместо

$key = array_search($needle, array_column($haystack, $column));

использовать

$keys = array_keys(array_column($haystack, $column), $needle);  // notice order of arguments

это работает :) большое спасибо. можно спросить ? есть ли простой способ получить эти совпадающие предметы?

Teoman Tıngır 12.06.2018 18:59

Разве это не легко? Конечно, вы можете просто перебрать $haystack и проверить значение поля. Но если у вас нет действительно огромного количества элементов в $haystack, вы не заметите разницы.

u_mulder 12.06.2018 19:01

Но если вам нужны не ключи, а значения - тогда следуйте ответу @biziclop с фильтрацией. Это более понятно.

u_mulder 12.06.2018 19:04

на самом деле, это то, что я задаю в вопросе, но, как вы упомянули, @biziclop ответьте, что мне нужно

Teoman Tıngır 12.06.2018 19:12

Вы можете использовать array_intersect и array_column.
Сначала он находит "регистровые" элементы и сопоставляет их с реальным массивом по ключам.

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

https://3v4l.org/pIQbZ

Ответ принят как подходящий

Скучное решение с использованием петли 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;
    });
}
$matches[] = $item Полагаю.
u_mulder 12.06.2018 19:05

Другие вопросы по теме