[php] (아마도) 연관 배열에서 첫 번째 키를 얻습니까?

연관 배열에서 첫 번째 키를 결정하는 가장 좋은 방법은 무엇입니까? 내 첫 번째는 배열을 foreach 한 다음 즉시 다음과 같이 깨는 것이라고 생각했습니다.

foreach ($an_array as $key => $val) break;

따라서 $ key가 첫 번째 키를 포함하지만 이것은 비효율적입니다. 누구든지 더 나은 솔루션을 가지고 있습니까?



답변

2019 년 업데이트

PHP 7.3 부터 array_key_first()내부 포인터를 재설정하지 않고 주어진 배열에서 첫 번째 키를 검색 하는 새로운 내장 함수 가 있습니다. 자세한 내용 은 설명서 를 확인하십시오 .


당신은 사용할 수 있습니다 resetkey:

reset($array);
$first_key = key($array);

기본 코드는 초기 코드와 동일하지만 약간의 오버 헤드가 적으며 현재 상황이 더 분명합니다.

를 호출해야합니다 reset. 그렇지 않으면 배열에 키가있을 수 있습니다. end대신 reset마지막 키를 얻는 대신 사용할 수도 있습니다 .

키가 첫 번째 값을 reset얻길 원한다면 실제로 반환합니다.

$first_value = reset($array);

그래도 조심해야 할 특별한 경우가 있습니다 (먼저 배열의 길이를 확인하십시오).

$arr1 = array(false);
$arr2 = array();
var_dump(reset($arr1) === reset($arr2)); // bool(true)


답변

array_keys키 배열을 반환합니다. 첫 번째 항목을 가져 가십시오. 또는 reset배열을 호출 할 수 key있습니다. 후자의 접근 방식은 아마도 약간 빠르지 만 (내가 테스트하지는 않았지만) 내부 포인터를 재설정하면 부작용이 있습니다.


답변

흥미롭게도 foreach 루프는 실제로 가장 효율적인 방법입니다.

OP가 효율성에 대해 구체적으로 요구했기 때문에 모든 현재 답변이 실제로 foreach보다 훨씬 덜 효율적이라는 점을 지적해야합니다.

나는 PHP 5.4로 이것에 대한 벤치 마크를했고, 리셋 / 키 포인터 방법 (허용 된 대답)은 foreach보다 약 7 배 느리게 보입니다. 전체 배열 (array_keys, array_flip)을 조작하는 다른 접근법은 분명히 그보다 느리고 대형 배열로 작업 할 때 훨씬 나빠 집니다 .

Foreach는 전혀 비효율적이지 않으므로 자유롭게 사용하십시오!

2015-03-03 수정 :

벤치 마크 스크립트가 요청되었습니다. 원본 스크립트는 없지만 새로운 테스트를했습니다. 이번에는 foreach가 재설정 / 키보다 약 두 배 빠릅니다. 100 키 배열을 사용하고 각 방법을 백만 번 실행하여 눈에 띄는 차이를 얻었습니다. 간단한 벤치 마크 코드는 다음과 같습니다.

$array = [];
for($i=0; $i < 100; $i++)
    $array["key$i"] = $i;

for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    foreach ($array as $firstKey => $firstValue) {
        break;
    }
}
echo "foreach to get first key and value: " . (microtime(true) - $start) . " seconds <br />";

for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    $firstValue = reset($array);
    $firstKey = key($array);
}
echo "reset+key to get first key and value: " . (microtime(true) - $start) . " seconds <br />";

for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    reset($array);
    $firstKey = key($array);
}
echo "reset+key to get first key: " . (microtime(true) - $start) . " seconds <br />";


for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    $firstKey = array_keys($array)[0];
}
echo "array_keys to get first key: " . (microtime(true) - $start) . " seconds <br />";

내 PHP 5.5에서는 다음과 같이 출력됩니다.

foreach to get first key and value: 0.15501809120178 seconds
reset+key to get first key and value: 0.29375791549683 seconds
reset+key to get first key: 0.26421809196472 seconds
array_keys to get first key: 10.059751987457 seconds

재설정 + 키 http://3v4l.org/b4DrN/perf#tabs
foreach는 http://3v4l.org/gRoGD/perf#tabs


답변

key($an_array) 첫 번째 열쇠를 줄 것이다

Blixt 당 편집 : 포인터를 배열의 시작 부분으로 재설정 reset($array);하기 전에 호출 해야 key($an_array)합니다.


답변

당신은 시도 할 수 있습니다

array_keys($data)[0]


답변

2018+

부터 PHP 7.3부터는 array_key_first()정확히 이것을 달성 하는 함수가 있습니다.

$array = ['foo' => 'lorem', 'bar' => 'ipsum'];
$firstKey = array_key_first($array); // 'foo'

설명서는 여기에서 볼 수 있습니다 . 😉


답변

list($firstKey) = array_keys($yourArray);