Получить ключ (не индекс) из подходящей строки в ассоциативном массиве ассоциативных массивов

Вот мой массив:

$array = [
    'key1' => [
        'first' => 'azerty',
        'second' => 'qwerty'
    ],
    'key2' => [
        'first' => 'hello',
        'second' => 'world'
    ]
];

Со значением «qwerty» я хотел бы получить «key1».

Я ищу что-то вроде этого:

$theKeyIWant = array_search('qwerty', array_column($array, 'second'));

Но я получаю «0» вместо «key1» (и я знаю, как это работает)

Кто-нибудь знает, как адаптировать этот код или знает другой код, чтобы получить значение ключа?

Прочитайте верхний пост в документации для array_search: array_column не сохраняет ключи для вашего массива.

Rogue 15.02.2023 18:11

Да, я знаю. Итак, мой вопрос: как адаптировать этот код для получения значения ключа?

Kozame 15.02.2023 18:16
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
2
51
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Чтобы решить эту проблему, нужно пройтись по внешнему массиву и использовать array_search() для поиска значения в каждом внутреннем массиве.

$value = 'qwerty';
$theKeyIWant = null;

foreach ($array as $key => $innerArray) {
  if (array_search($value, $innerArray) !== false) {
    $theKeyIWant = $key;
    break;
  }
}

echo $theKeyIWant; // Output: key1

Я ищу что-то более сексуальное, но да, такой код работает.

Kozame 15.02.2023 18:23

array_keys возвращает массив ключей массива.

<?php

$array = [
'key1' => [
    'first' => 'azerty',
    'second' => 'qwerty'
],
'key2' => [
    'first' => 'hello',
    'second' => 'world'
]
];
$theKeyIWant = array_search('qwerty', array_column($array, 'second'));
echo array_keys($array)[$theKeyIWant];
?>

3В4л

Я знаю, что массивы PHP упорядочены, но это кажется грязным. Опять же, PHP грязный...

Rogue 15.02.2023 18:27
Ответ принят как подходящий

Небольшая модификация вашего кода для объединения ключей и значений столбцов:

$theKeyIWant = array_search('qwerty', array_combine(array_keys($array), array_column($array, 'second')));

Проблема с поиском «чего-то более привлекательного» для этой задачи заключается в том, что если «более привлекательный» означает «функциональный итератор», то это связано с невозможностью «вернуться раньше» (выполнением ненужных циклов).

Если вы хотите, чтобы вызывалась однострочная функция, вы можете создать свою собственную и поместить ее в вспомогательный файл где-нибудь в своем проекте. Мой главный совет — отказаться от «sexy» для этой задачи и использовать разрываемый цикл foreach.

Код: (Демо)

function getRowKey($array, $column, $value) {
    foreach ($array as $key => $row) {
        if ($row[$column] === $value) {
            return $key;
        }
    }
    return null;
}

var_export(getRowKey($array, 'second', 'qwerty'));

Если вы собираетесь выполнять повторный поиск в одном и том же массиве, а второй столбец гарантированно содержит уникальные значения, вы можете преобразовать массив в массив поиска без потери каких-либо данных. (Демо )

function restructure($array, $columnToKey) {
    $result = [];
    foreach ($array as $key => $row) {
        $result[$row[$columnToKey]] = $row + ['oldKey' => $key];
    }
    return $result;
}

var_export(restructure($array, 'second')['qwerty']);

Мой массив не будет слишком большим, поэтому я выберу более сексуальный путь. Но спасибо за ваше объяснение. Я помню это решение и воспользуюсь им в следующий раз, если позволит ситуация.

Kozame 16.02.2023 09:25

Гарантируется ли уникальность значений в столбце second? Если нет, какой ключ первого уровня вам нужен, если в массиве есть две подходящие строки? Первое или второе?

mickmackusa 16.02.2023 11:05

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