Вот мой массив:
$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() для поиска значения в каждом внутреннем массиве.
$value = 'qwerty';
$theKeyIWant = null;
foreach ($array as $key => $innerArray) {
if (array_search($value, $innerArray) !== false) {
$theKeyIWant = $key;
break;
}
}
echo $theKeyIWant; // Output: key1
Я ищу что-то более сексуальное, но да, такой код работает.
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 грязный...
Небольшая модификация вашего кода для объединения ключей и значений столбцов:
$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']);
Мой массив не будет слишком большим, поэтому я выберу более сексуальный путь. Но спасибо за ваше объяснение. Я помню это решение и воспользуюсь им в следующий раз, если позволит ситуация.
Гарантируется ли уникальность значений в столбце second? Если нет, какой ключ первого уровня вам нужен, если в массиве есть две подходящие строки? Первое или второе?
Прочитайте верхний пост в документации для array_search: array_column не сохраняет ключи для вашего массива.