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


756

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

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

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


4
왜 비효율적입니까?
Emilio Gort

2
모든 답변과 비교할 때 foreach는 여전히 가장 빠른 FIDDLE, PHP 5.3 입니다 .PHP 5.5의 로컬 호스트 테스트에서 차이가 약간 foreach에 유리하다는 것을 보여줍니다.
Danijel

3
@Danijel foreach은 의미 상 잘못입니다.
Pacerier

2
@AlexS, each($arr)['key']또는 each($arr)[0]작동합니다.
Pacerier

1
@Danijel 더 이상은 아닙니다 ... 키 : 0.0107, foreach :0.0217
SeanJA

답변:


1337

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)

141
참고로, reset()모든 배열의 첫 번째 요소 (키가 아닌 값)를 반환하므로 편리합니다.
devios1

5
문서에는 reset ()` reset()이라고 말 Don't use 하여 연관 배열의 첫 번째 값을 얻는 것에 대한 주석이 있습니다 . 실제 배열에는 효과적이지만 Iterator 객체에서는 예기치 않게 작동합니다. bugs.php.net/bug.php ? id=38478` 아직도 그래요? 혼란스러워
Dmitry Pashkevich

13
@DmitryPashkevich : 그 의견에 대해 걱정하지 마십시오. 그들은 array객체가 아니라 사용자 정의 객체 (실제 배열 이 아님)에 대해 이야기하고 있습니다. 데이터 구조의 차이가 혼란 스러웠지만 기본적으로 reset첫 번째 "키"의 값을 반환합니다.이 값은 개체의 $prop경우 "버그"보고서에 제공된 예제에 있지만 배열의 경우 첫 번째 키입니다. 따라서 실제 배열 (으로 생성 array(…)) 을 사용 하는 한 문제가 없습니다.
Blixt

2
end () 및 reset ()에는 부작용이 있습니다. 그러나 세계 대부분의 코드는 내부 포인터에 의존하지 않으므로 일반적으로 문제가되지 않습니다.
donquixote

1
@ user3019105 배열 당 하나의 내부 포인터 만 있습니다. 즉, 함수 외부의 코드 next에서 reset, end또는 호출 하여 배열을 변경하면 호출 할 때 예상 값을 얻지 못합니다 key. 예, 항상 reset사용 key하기 전에 전화 하여 원하는 것을 얻으십시오.
Blixt

80

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


52
미래의 독자들에게 단지 (늦은) 참고 사항 : 후자의 접근법은 "약간"빠른 것이 아닙니다. 전체 배열을 반복하고 새로 생성 된 다른 배열에 모든 키를 저장하고 배열의 첫 번째 키를 문자열로 요청하는 것에는 큰 차이가 있습니다.
Blixt

3
문제의 op가 이러한 모든 답변과 비교할 때 왜 비효율적입니까?
Emilio Gort

5
@EmilioGort 좋은 질문입니다. 실제로 foreach+ breakreset+ 의 성능에는 차이가 없다고 생각 key합니다. 그러나 전자는 다소 이상하게 보이므로 스타일 문제의 경우 후자를 선호합니다.
troelskn

@EmilioGort : Afaik, foreach ()는 배열을 내부적으로 복사합니다. 따라서 느리다고 가정 할 수 있습니다. (누군가가 그것을 확인할 수 있다면 좋을 것입니다)
donquixote

3
@ donquixote 확실하지 않지만, 그것이 일반적인 배열 (그리고 어떤 종류 또는 Iterator 인터페이스를 구현하는 객체가 아니라고 가정)으로 가정 foreach하면 내부 사본을 만들지 않고 포인터를 반복합니다. 더 낮은 수준의 사용과 유사 next, current
troelskn을

54

흥미롭게도 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


3
어딘가에 벤치 마크가 있습니까? 어쨌든 테스트 한 방법과 같이 실행 해 주셔서 감사합니다!
flu

전체 테스트를 통해 동일한 배열이 사용된다는 사실을 지적하고 싶습니다. 이 사실이 foreach 접근 방식에 큰 영향을 미친다고 생각합니다. @donquixote가 위의 일부 응답에 대한 주석에서 언급했듯이 foreach는 내부적으로 배열을 복사합니다. 어레이 복사를 피하면이 테스트 내에서만 성능이 향상되므로 벤치 마크를 실행하는 동안이 사본이 재사용된다고 생각할 수 있습니다.
Jarda

2
@Jarda php7부터 foreachforeach 루프 내에서 직접 수정하지 않는 한 배열을 복사하지 마십시오. php5에서 경우에 따라 배열 구조를 복사 할 수 있으며 (재귀 횟수가 1보다 큰 경우) 실제로 올바른 위치에 큰 영향을 줄 수 있습니다. 다행히이 문제가 해결 된 php7에 대해서는 걱정할 필요가 없습니다. 다음 은 현재 foreach가 현재 작동하는 방식과 과거에 어떻게 작동했는지에 대한 훌륭한 내용입니다.
Webmut

2
위의 벤치 마크를 사용하는 php7.2 기준으로, foreach는 여전히 가장 빠름
billynoah

36

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

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


7
배열의 포인터가 첫 번째 요소가 아닐 수도 있습니다. 내 대답을 참조하십시오.
블릭스

배열이 하나의 요소 만 가지고 있는지 확인하기 때문에이 답변이 재설정하지 않고 내 경우에 도움이 될 것이라고 생각합니다. 감사
groovenectar


22

2018+

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

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

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


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

2
이것은 아마도 가장 효율적인 것은 아닙니다.
Yada

3
@Yada, 그렇습니다. 그러나 드물게 눈에 띄는 경우가 있습니다. 대부분의 경우 가독성과 유지 관리 성이 훨씬 중요합니다. 또한 원래 객체 / 배열을 변경하지 않는 솔루션을 선호합니다 : 예 : reset ($ ar); $ key = 키 ($ ar); -항상 좋은 생각은 아니며, 오히려 내 것보다 더 간결한 MartyIX 솔루션을 선택했다. 예 : array_keys ($ ar) [0];
Sergiy Sokolenko

20

효율성이 그렇게 중요하지 않은 경우 array_keys($yourArray)[0]PHP 5.4 이상에서 사용할 수 있습니다 .

예 :

# 1
$arr = ["my" => "test", "is" => "best"];    
echo array_keys($arr)[0] . "\r\n"; // prints "my"


# 2
$arr = ["test", "best"];
echo array_keys($arr)[0] . "\r\n"; // prints "0"

# 3
$arr = [1 => "test", 2 => "best"];
echo array_keys($arr)[0] . "\r\n"; // prints "1"

솔루션보다 장점 :

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

array_keys($arr)[0]함수 매개 변수 (예 :) 로 전달할 수 있다는 것 doSomething(array_keys($arr)[0], $otherParameter)입니다.

HTH


3
합니까의 array_keys($arr)[0]구문은 유효합니까?
trante

5
PHP 5.4에 있습니다. 이라고 array dereferencing합니다. 예를 들어 : schlueters.de/blog/archives/…
Martin Vseticka

@trante, PHP <5.4를 제외한 모든 언어에서 유효합니다.
Pacerier

13

다음을 찾으십시오.

$yourArray = array('first_key'=> 'First', 2, 3, 4, 5);
$keys   =   array_keys($yourArray);
echo "Key = ".$keys[0];

작업 예 :


12
$myArray = array(
    2 => '3th element',
    4 => 'first element',
    1 => 'second element',
    3 => '4th element'
);
echo min(array_keys($myArray)); // return 1

1
@jurgemaister max()dose는 assoc 배열의 첫 번째 키를 반환하지 않습니다. 목록 또는 배열 항목의 최대 반환 최대 값
Hamidreza

5
OP 요청은 아니지만 일부 상황에서는 매우 유용합니다.
d.raev

9

이것은 또한 해결책이 될 수 있습니다.

$yourArray = array('first_key'=> 'First', 2, 3, 4, 5);
$first_key = current(array_flip($yourArray));
echo $first_key;

나는 그것을 테스트했고 작동합니다.

작업 코드 .


3
array_flip () : STRING과 INTEGER 값만 뒤집을 수 있습니다!
Mauro

5

Webmut 솔루션을 향상시키기 위해 다음 솔루션을 추가했습니다.

$firstKey = array_keys(array_slice($array, 0, 1, TRUE))[0];

PHP 7.1에서의 출력은 다음과 같습니다.

foreach to get first key and value: 0.048566102981567 seconds 
reset+key to get first key and value: 0.11727809906006 seconds 
reset+key to get first key: 0.11707186698914 seconds 
array_keys to get first key: 0.53917098045349 seconds 
array_slice to get first key: 0.2494580745697 seconds 

10000 크기의 배열에 대해이 작업을 수행하면 결과는

foreach to get first key and value: 0.048488140106201 seconds 
reset+key to get first key and value: 0.12659382820129 seconds 
reset+key to get first key: 0.12248802185059 seconds 
array_slice to get first key: 0.25442600250244 seconds 

array_keys 메소드는 30 초에 시간 초과됩니다 (1000 개의 요소 만 사용하면 나머지 시간은 거의 동일하지만 array_keys 메소드는 약 7.5 초입니다).


3
 $arr = array('key1'=>'value1','key2'=>'value2','key3'=>'key3');
 list($first_key) = each($arr);
 print $first_key;
 // key1

3

나를 위해 일한 가장 좋은 방법은

array_shift(array_keys($array))

array_keys 초기 배열에서 키 배열을 가져온 다음 array_shift첫 번째 요소 값에서 잘라냅니다. 이를 위해서는 PHP 5.4+가 필요합니다.


3

이것은 내가 찾은 가장 쉬운 방법입니다. 빠르고 두 줄의 코드 :-D

$keys = array_keys($array);
echo $array[$keys[0]];


0

원 라이너 :

$array = array('key1'=>'value1','key2'=>'value2','key3'=>'key3');
echo key( array_slice( $array, 0, 1, true ) );

# echos 'key1'

0

오늘 나는 POST 요청에 의해 반환 된 배열의 첫 번째 키를 검색해야했습니다. (그리고 양식 ID 번호 등을 기록하십시오)

글쎄, 나는 이것을 발견했다 : PHP에서 연관 배열의 첫 번째 키를 반환

http://php.net/key

나는 이것을했고 그것이 효과가있다.

    $data = $request->request->all();
    dump($data);
    while ($test = current($data)) {
        dump($test);
        echo key($data).'<br />';die();
        break;
    }

어쩌면 다른 남자의 15 분을 에코 할 것입니다. CYA.


-2

당신은 당신의 배열로 재생할 수 있습니다

$daysArray = array('Monday', 'Tuesday', 'Sunday');
$day = current($transport); // $day = 'Monday';
$day = next($transport);    // $day = 'Tuesday';
$day = current($transport); // $day = 'Tuesday';
$day = prev($transport);    // $day = 'Monday';
$day = end($transport);     // $day = 'Sunday';
$day = current($transport); // $day = 'Sunday';

사용할 수있는 배열의 첫 번째 요소를 얻으려면 current마지막 요소에 사용할 수 있습니다end

편집하다

답변에 대해 더 이상 투표를하지 않기 위해 array_keys위와 같이 키를 가치로 변환 하고 사용할 수 있습니다.


1
이것은 키가 아닌 값입니다.
Victor Schröder
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.