PHP: получить ключ из массива?

Я уверен, что это очень простая и встроенная функция в PHP, но я ее еще не видел.

Вот что я делаю на данный момент:

foreach($array as $key => $value) {
    echo $key; // Would output "subkey" in the example array
    print_r($value);
}

Могу ли я вместо этого сделать что-то вроде следующего и тем самым избавить себя от написания «$ key => $ value» в каждом цикле foreach? (псевдокод)

foreach($array as $subarray) {
    echo arrayKey($subarray); // Will output the same as "echo $key" in the former example ("subkey"
    print_r($value);
}

Спасибо!

Массив:

Array
(
    [subKey] => Array
        (
            [value] => myvalue
        )

)

person Industrial    schedule 23.07.2010    source источник
comment
Что не так с foreach($array as $key => $value)? Или, наоборот, какой смысл использовать foreach($array as $value), когда вам действительно нужно $key где-то в будущем?   -  person Tomalak    schedule 23.07.2010
comment
Я просто подумал, что было бы неплохо получить ключ побыстрее.   -  person Industrial    schedule 23.07.2010
comment
Но вы получаете это быстро с помощью foreach($array as $key => $value)... :-) Или ситуация не в том, что вы находитесь в цикле foreach?   -  person Tomalak    schedule 23.07.2010
comment
Я точно нахожусь в цикле foreach, но я подумал о том, чтобы не менять оператор foreach, а просто распечатать ключ.   -  person Industrial    schedule 23.07.2010
comment
Каждый вызов функции, который вы могли бы сделать, был бы менее эффективным, чем просто переход на соответствующую конструкцию цикла foreach.   -  person Tomalak    schedule 23.07.2010
comment
@Tomalak: я полностью с тобой согласен. Даже не имеет смысла преобразовывать циклы foreach в циклы while для получения имени ключа (или индекса) - в обратном порядке (так что это противоположно тому, что хотел бы сделать Industrial!), это имело бы смысл!   -  person Sk8erPeter    schedule 09.01.2012
comment
@sk8erpeter это всегда вопрос контроля над обычным поведением цикла: если вы хотите перейти к определенным клавишам из-за значения текущего ключа, ваш foreach должен сохранить значение в какой-либо другой переменной и использовать условия для следующих значений (поэтому менее эффективен)... В while лайке вторхонен вам нужно только if($element=='jump3')next(next(next($array)))   -  person Armfoot    schedule 14.08.2013
comment
@Armfoot: надеюсь, ты просто шутишь (потому что этот аргумент кажется чушью). Я думаю, что накладные расходы на ваши вызовы next(next(next($array))) намного выше (поэтому менее эффективны), чем сохранение значения в какой-либо другой переменной и использование цикла foreach в обычной форме $key=>$value... не говоря уже о том, что код, который вы показали, слишком некрасиво использовать его где угодно.   -  person Sk8erPeter    schedule 14.08.2013
comment
@ Sk8erPeter хорошо, это не сохранение в какой-то другой переменной, это testing для последующих ключей массива и continue для следующих в foreach ... Мы все можем размышлять, насколько эффективен один будет по сравнению с другим во многих разных случаях и насколько тяжелым может быть указатель сдвига указателя (next... разница в наносекундах? Эффективность алгоритма обычно обдумывается логикой), но это не моя точка зрения. Я хочу сказать: у вас может быть другая цель для вашего цикла, где вы действительно хотите перепрыгнуть несколько клавиш в соответствии с конкретными, поэтому вам не нужно беспокоиться об условиях для других клавиш.   -  person Armfoot    schedule 15.08.2013


Ответы (7)


Вы можете использовать key():

<?php
$array = array(
    "one" => 1,
    "two" => 2,
    "three" => 3,
    "four" => 4
);

while($element = current($array)) {
    echo key($array)."\n";
    next($array);
}
?>
person vtorhonen    schedule 23.07.2010
comment
Я хочу добавить, что вы можете использовать key() ВЕЗДЕ, но для этой проблемы имеет смысл использовать его в цикле while. Вы можете использовать key() только в том случае, если вам нужен ключ первого/текущего элемента массива. - person JRomero; 21.11.2012
comment
@Industrial foreach использует ключ... если вы хотите использовать foreach, сделайте следующее: foreach($array as $key => $value) { ... } - person Greg; 16.10.2013

Используйте функцию array_search.

Пример с php.net

$array = array(0 => 'blue', 1 => 'red', 2 => 'green', 3 => 'red');

$key = array_search('green', $array); // $key = 2;
$key = array_search('red', $array);   // $key = 1;
person Sarfraz    schedule 23.07.2010

Если это цикл foreach, как вы описали в вопросе, использование $key => $value будет быстрым и эффективным.

person Dogbert    schedule 23.07.2010

Если вы хотите быть в цикле foreach, то foreach($array as $key => $value) определенно является рекомендуемым подходом. Воспользуйтесь преимуществом простого синтаксиса, если язык предлагает его.

person Mike Lang    schedule 05.06.2015

Другой способ использования key($array) в цикле foreach — использовать next($array) в конце цикла, просто убедитесь, что каждая итерация вызывает функцию next() (если у вас сложное ветвление внутри цикла)

person B Rad C    schedule 02.02.2013

Попробуй это

foreach(array_keys($array) as $nmkey)
    {
        echo $nmkey;
    }
person Chamandeep    schedule 01.06.2016

Вот общее решение, которое вы можете добавить в свою библиотеку Array. Все, что вам нужно сделать, это предоставить соответствующее значение и целевой массив!

Руководство по PHP: array_search() (аналогично .indexOf( ) на других языках)

public function getKey(string $value, array $target)
{
    $key = array_search($value, $target);

    if ($key === null) {
        throw new InvalidArgumentException("Invalid arguments provided. Check inputs. Must be a (1) a string and (2) an array.");
    }

    if ($key === false) {
        throw new DomainException("The search value does not exists in the target array.");
    }

    return $key;
}
person Anthony Rutledge    schedule 08.05.2019