Получить первый ключ в многомерном массиве с помощью PHP

Я хотел бы получить первый ключ из этого многомерного массива.

Array
(
    [User] => Array
        (
            [id] => 2
            [firstname] => first
            [lastname] => last
            [phone] => 123-1456
            [email] => 
            [website] => 
            [group_id] => 1
            [company_id] => 1
        )

)

Этот массив хранится в $this->data.

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

Есть ли другие способы получить этот результат?

Спасибо


person user103219    schedule 25.08.2009    source источник
comment
array_shift() тоже подойдет.   -  person Wayne    schedule 19.12.2009


Ответы (3)


Есть и другие способы сделать это, но не такие быстрые и короткие, как использование key(). Любое другое использование предназначено для получения всех ключей. Например, все они вернут первый ключ в массиве:

$keys=array_keys($this->data);
echo $keys[0]; //prints first key

foreach ($this->data as $key => $value)
{
    echo $key;
    break;
}

Как видите, оба небрежны.

Если вам нужен oneliner, но вы хотите защитить себя от случайного получения неправильного ключа, если итератор не находится на первом элементе, попробуйте следующее:

reset($this->data);

reset():

reset() перематывает внутренний указатель массива на первый элемент и возвращает значение первого элемента массива.

Но то, что ты делаешь, кажется мне прекрасным. Есть функция, которая делает именно то, что вы хотите, в одной строке; что еще вы могли бы хотеть?

person ryeguy    schedule 25.08.2009
comment
Хм, я думаю, что я буду использовать этот метод вместо этого. В соответствии с руководством по PHP key() определяется как key(), возвращающий элемент индекса текущей позиции массива. Итак, если по какой-то причине мы не в самой первой позиции массива, он вернет неверный ключ. - person user103219; 25.08.2009
comment
Спасибо, я буду придерживаться key(). - person user103219; 25.08.2009
comment
Извините, я только что увидел ваше последнее редактирование (я думаю, что редактирование занимает минуту или около того, чтобы опубликовать его)... reset() был именно тем, что я искал. Я не знаю, почему массив не будет на первой позиции, но лучше перестраховаться, чем сожалеть! - person user103219; 25.08.2009

Используйте это (PHP 5.5+):

echo reset(array_column($this->data, 'id'));
person Odirlei    schedule 26.09.2015
comment
Не могли бы вы предоставить объяснение с вашим кодом? Это может помочь OP или будущим пользователям больше. - person Bono; 26.09.2015

У меня была похожая проблема, которую нужно было решить, и я был рад найти этот пост. Однако предоставленные решения работают только для 2 уровней и не работают для многомерного массива с любым количеством уровней. Мне нужно было решение, которое могло бы работать с массивом любой размерности и могло бы найти первые ключи каждого уровня.

После небольшой работы я нашел решение, которое может быть полезно кому-то еще, и поэтому я включил свое решение в этот пост.

Вот пример начального массива:

    $myArray = array(
    'referrer' => array(
        'week' => array(
            '201901' => array(
                'Internal' => array(
                    'page' => array(
                        'number' => 201,
                        'visits' => 5
                    )
                ),
                'External' => array(
                    'page' => array(
                        'number' => 121,
                        'visits' => 1
                    )
                ),
            ),
            '201902' => array(
                'Social' => array(
                    'page' => array(
                        'number' => 921,
                        'visits' => 100
                    )
                ),
                'External' => array(
                    'page' => array(
                        'number' => 88,
                        'visits' => 4
                    )
                ),
            )
        )
    )
);

Поскольку эта функция должна отображать все клавиши кулака независимо от размера массива, это предполагает рекурсивную функцию, и моя функция выглядит так:

function getFirstKeys($arr){
    $keys = '';
    reset($arr);
    $key = key($arr);
    $arr1 = $arr[$key];
    if (is_array($arr1)){
        $keys .= $key . '|'. getFirstKeys($arr1);
    } else {
        $keys = $key;
    }
    return $keys;
}

Когда функция вызывается с использованием кода:

$xx = getFirstKeys($myArray);
echo '<h4>Get First Keys</h4>';
echo '<li>The keys are: '.$xx.'</li>';

вывод:

Получить первые ключи

  • Ключи: реферер|неделя|201901|внутренний|страница|номер

Я надеюсь, что это сэкономит кому-то немного времени, если они столкнутся с подобной проблемой.

person Clinton    schedule 24.01.2019