배열에서 마지막 키를 얻는 방법?


335

배열의 마지막 키를 어떻게 얻을 수 있습니까?


10
연관 배열, 숫자 배열 또는 둘 다 작동해야하는 경우를 지정해야합니다.
Jimbo Jonny

자주 묻는 질문
Josua Marcel Chrisano

답변:


610

해결책은 조합 사용하는 것 end(인용)를 :key

  • end() array의 내부 포인터를 마지막 요소로 이동시키고 값을 반환합니다.
  • key() 현재 배열 위치의 인덱스 요소를 반환합니다.

따라서이 코드와 같은 코드의 일부는 트릭을 수행해야합니다.

$array = array(
    'first' => 123,
    'second' => 456,
    'last' => 789, 
);

end($array);         // move the internal pointer to the end of the array
$key = key($array);  // fetches the key of the element pointed to by the internal pointer

var_dump($key);

출력 :

string 'last' (length=4)

즉 내 배열의 마지막 요소의 키입니다.

이 작업이 완료되면 배열의 내부 포인터는 배열의 끝에 있습니다. 주석에서 지적했듯이 reset()포인터를 배열의 시작 부분으로 다시 가져 오기 위해 배열에서 실행할 수 있습니다 .


17
@Pim : OP가 그 배열과 관련하여 수행하려는 작업에 따라 다릅니다 (호출 할 필요는 없음 reset()) ; 그러나 당신은 그 기능을 가리키는 것이 옳습니다.
Pascal MARTIN

3
@PascalMARTIN +1 답변에 reset ()에 대한 의견을 추가하면 매우 도움이 될 것이라고 생각합니다.
Lulu

배열에 중복 값이 ​​있으면이 방법이 작동하지 않습니다. 예. 왜냐하면 array('a', 'b', 'c', 'd', 'a')그것은 키 4가 아닌 0을 리턴 할 것이기 때문입니다.
Marc

2
@Marc이 방법은 중복 값이 ​​있어도 올바르게 작동합니다.
Jeff

1
@pppp 그것은 작동하지 않기 때문에 ... end () 반환하는 것을 확인하고 다시 생각;)
forsberg

79

하지만 end()가장 쉬운 것 같다, 그것은 가장 빠른 아니다. 더 빠르고 강력한 대안은 array_slice()다음과 같습니다.

$lastKey = key(array_slice($array, -1, 1, true));

테스트에서 알 수 있듯이 500000 요소가있는 배열에서는 거의 7 배 빠릅니다!


98
이 답변에 흥분하여 (a) end($arr);$key = key($arr);reset($arr);와 (b) $key = key(array_slice($arr,-1,1,true));...를 비교하여 100,000 반복의 빠른 테스트를 수행했습니다 end(). end () = 0.05326 초, array_slice = 8.506 초 ... huh ??
neokio

54
PHP의 내장 함수는 극심한 괴상한 것들에 의해 만들어졌습니다. 해당 기능을 다시 작성하지 마십시오. 당신이 원본보다 훨씬 느리게 만들 가능성이 있습니다. 당신이 일종의 사악한 마법사가 아니라면, couse.
dmmd

16
end()다음과 같은 매우 간단한 C 함수에서 파생 될 수 있기 때문에 가장 빠릅니다.int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
Gustav

10
@Gustav PHP의 기본 C 구현은 실제로 last마지막 요소에 대한 내부 포인터 가 있다고 생각합니다 . end()거의 O (1) 만들기 . :-)
Eric

15
@ dmmd, PHP 팀은 그들이 대단하다라고 매우 기쁘게 생각합니다.
datasn.io

53

나는 선호한다

end(array_keys($myarr))

19
STRICT NOTICE, end는 변수 참조를 기대합니다
Wiliam

25
end((array_keys($myarr)))통지를 우회하는 데 사용할 수 있습니다 .
벤 포

9
@BenFortune 이것은 PHP7에서 수정되었습니다 : "PHP 5에서, 함수 매개 변수 주위에 중복 괄호를 사용하면 함수 매개 변수가 참조로 전달 될 때 엄격한 표준 경고를 침묵시킬 수 있습니다. 이제 경고가 항상 발행됩니다."
Dominic Scheirlinck

그것은 완전히 불필요한 경고입니다! 그것은 다른 모든 언어에서 그렇게 평범하고 평범한 것들입니다!
azerafati

1
다른 언어에서는 함수가 포인터에서 작동하지 않습니까?
jurchiks

52

PHP 7.3 (2018) 부터 다음과 같은 기능이 있습니다 : http://php.net/manual/en/function.array-key-last.php

$array = ['apple'=>10,'grape'=>15,'orange'=>20];
echo array_key_last ( $array )

출력합니다

orange

4
호 레이! 이 답변을 추가하려고했습니다. "PHP 7.3"버전과 2018 년을 강조해 주시겠습니까? 다른 사람이 멋진 소식을 탐지하는 쉬울 것
토마스 Votruba

내부 배열 포인터에는 영향을 미치지 않습니다.
mvorisek 2016

30

그냥 사용하십시오 : echo $array[count($array) - 1];


75
숫자 배열이있는 경우에만 작동합니다. 연관 배열로 실패합니다.
Jeremy J Starcher

12
이것은 숫자 배열에서만 작동 할뿐만 아니라 키를 표시하지 못하지만 값을 표시하지 않습니다.
Nanne

나도 제이크, 우리는 우리가이 분할 일을 할 수있는 우리 모두에게 오래된 참조가 너무 연관 모두 수치로 최고 구글의 히트를 (정직 할 수 있습니다)하고 분석 한 후 ASSOC 위해이었다 아웃 ... 나는 단지 일 int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }이다 당신이 시간 예산에있을 때 재미 있지만 사업에는 좋지 않다
lol

5
또한 숫자 형 배열의 경우에도 숫자 형 배열이 순서대로 진행되거나 모든 숫자를 사용할 필요는 없습니다. 숫자 값에 명시 적으로 할당하지 않으면 작동하지만 그렇게하면 $a[1] = 1; $a[5] = 5; $a[0] = 0;키 (1, 5, 0)의 순서로 배열됩니다. count($a)3을 산출하고 $a[2]정의되지 않습니다. 확실히 5를 돌려주지 않습니다.
Daniel Skarbek

1
" 배열에서 마지막 를 얻는 방법"질문을 다시 읽으십시오.

20

이것이 더 빠를 지 아닌지 모르지만, 이렇게하는 것이 더 쉬운 것처럼 보이고, end ()에 함수를 전달하지 않아 오류를 피할 수 있습니다 ...

단지 한 줄의 코드를 작성하는 데 큰 변수가 아닌 변수가 필요했습니다. 필요한 경우 설정을 해제하십시오.

$array = array(
    'first' => 123,
    'second' => 456,
    'last' => 789, 
);

$keys = array_keys($array);
$last = end($keys);

2
이 답변 (기술적으로는 정확하지만)은 추가 배열 (원래 길이와 동일한 길이)을 생성해야하기 때문에 낭비적이고 비효율적입니다. 이것은 원래 어레이처럼 폐기물이 증가한다는 것을 의미합니다. 이것은 파스칼 마틴의 효율적인 답변보다 절대로 선택해서는 안됩니다. 나는 이것이 너무 많은 투표를 한 것에 놀랐다.
mickmackusa

12

현재로 PHP7.3 직접의 마지막 키 (의 외부 수준)와 배열에 액세스 할 수 있습니다 ) (array_key_last를

결정적으로이 페이지에 대한 많은 논쟁이 잠들었습니다. 이 솔루션은 최고의 성능을 발휘하며 부작용이 없으며 직접적으로 직관적 인 단일 통화 기술로이 질문이 추구하는 것을 제공합니다.

증거로서의 대략적인 벤치 마크 : https://3v4l.org/hO1Yf

array_slice() + key():  1.4
end() + key():         13.7
array_key_last():       0.00015

* 테스트 배열에는 500000 개의 요소가 포함되며, 마이크로 타임은 100x 반복되고 평균은 과학적 표기법을 피하기 위해 1000을 곱한 값입니다. @TadejMagajna의 답변따르면 초기 벤치 마크에 대한 @MAChitgarha의 의견 .

즉, 다음없이 최종 키 값을 검색 할 수 있습니다.

  1. 배열 포인터 이동 (두 줄의 코드 필요) 또는
  2. 정렬, 역전, 팝핑, 카운팅, 키 배열 인덱싱

이 기능은 오래 전부터 사용되어 성능을 개선하고 원하지 않는 부작용을 피하며 깨끗하고 직접적인 / 직관적 인 코드를 가능하게하는 어레이 기능 공구 벨트에 추가되었습니다.

데모 는 다음과 같습니다 .

$array = ["a" => "one", "b" => "two", "c" => "three"];
if (!function_exists('array_key_last')) {
    echo "please upgrade to php7.3";
} else {
    echo "First Key: " , key($array) , "\n";
    echo "Last Key: " , array_key_last($array) , "\n";
    next($array);                 // move array pointer to second element
    echo "Second Key: " , key($array) , "\n";
    echo "Still Last Key: " , array_key_last($array);
}

산출:

First Key: a
Last Key: c     // <-- unaffected by the pointer position, NICE!
Second Key: b
Last Key: c     // <-- unaffected by the pointer position, NICE!

몇 가지 참고 사항 :

  • array_key_last()array_key_first () 의 형제 함수입니다. .
  • 이 두 기능은 모두 "포인터 무시"입니다.
  • 두 함수 모두 반환 null배열이 비어 있으면 됩니다.
  • 폐기 된 형제 기능 ( array_value_first()& array_value_last())도 포인터 불명료 한 북 엔드 요소에 대한 액세스를 제공했을 것입니다.

다음은 새로운 기능에 대해 설명하는 관련 페이지입니다.

ps 누군가가 다른 기술 중 일부를 계량하고 있다면, 당신은이 작은 비교 모음을 참조 할 수 있습니다 : ( Demo )

Duration of array_slice() + key():     0.35353660583496
Duration of end() + key():             6.7495584487915
Duration of array_key_last():          0.00025749206542969
Duration of array_keys() + end():      7.6123380661011
Duration of array_reverse() + key():   6.7875385284424
Duration of array_slice() + foreach(): 0.28870105743408

2
이 답변은 목록 상단에 있어야합니다. 간단합니다.
John

1
와우, 내 대답에 대한 DV? 너무 포괄적 / 결정적 / 설명 적 / 지원되는 문제는 무엇입니까? ff 감히 정보를 게시하는 게시물을 계속 푸시 다운하십시오. 잘 했어. 모르는 경우 DV 버튼은 "유용하지 않은"게시물에 사용됩니다. 당신의 목표가 무엇인지 스스로에게 물어보십시오.
mickmackusa

8

다음과 같이 array_poparray_keys 함수를 사용해보십시오 .

<?php

$array = array(
    'one' => 1,
    'two' => 2,
    'three' => 3
);

echo array_pop(array_keys($array)); // prints three

?>

14
배열에 둘 이상의 항목이 있으면 실제로 느립니다. 이러지 마십시오.
Andrey

3
STRICT NOTICE도 유발합니다. 변수 참조
Wiliam

array_pop ()은 원래 배열을 제거하여 원래 배열을 줄입니다. 이것이 OP에 중요한지 확실하지 않지만 다른 사람들에게는 중요 할 것입니다.
Programster

1
실제로는 아닙니다. 이 예에서 array_pop()의 리턴 값에서 동작 array_keys()하고 있지 일본어 어레이.
Petko Bossakov

통지를 유발하지 않는 더 효율적인 다른 답변이 있기 때문에이 답변을 하향 조정합니다.
mickmackusa

6

PHP에서 == 7.3 array_key_last()은 배열의 마지막 키를 얻는 가장 좋은 방법입니다. 의 조합을 사용하여 end(), key()그리고 reset()단지 배열의 마지막 키를 얻기 위해하는 것은 터무니없는 것입니다.

$array = array("one" => bird, "two" => "fish", 3 => "elephant");
$key = array_key_last($array);
var_dump($key) //output 3

그것을 비교

end($array)
$key = key($array)
var_dump($key) //output 3
reset($array)

end()와 조합을 사용하는 경우 포인터가 시작 부분에 있도록 배열을 재설정해야합니다.key()


4

또한이 문제에 대한 대안 솔루션을 제공하고 싶습니다.

모든 키가 공백없이 숫자라고 가정하면, 선호하는 방법은 배열 키를 0에서 시작한다는 사실을 고려하여 배열을 세고 그 값에서 1을 뺀 것입니다.

$array = array(0=>'dog', 1=>'cat');

$lastKey = count($array)-1;
$lastKeyValue = $array[$lastKey];

var_dump($lastKey);
print_r($lastKeyValue);

이것은 당신에게 줄 것입니다 :

int (1) 고양이


1
키가 증분되지 않은 배열에서는 작동하지 않습니다. 예 : array (0 => 'dog', 5 => 'cat'); $ lastKey는 잘못된 값을 반환 할 것입니다
kakoma

@kakoma-내 게시물에 "모든 키가 공백없이 숫자라고 가정"이라고 말합니다.

궁금하신 분들은 PHP의 "array_values"를 사용하여 배열을 숫자 순차로 다시 입력하십시오. php.net/manual/en/function.array-values.php

1
이 답변은 일부 배열 가능성 (숫자, 연속 키 배열) 만 처리하므로 OP의 일반화 된 질문에 대한 강력하고 정확한 답변을 제공하지 않습니다. 공감.
mickmackusa

4

이것을 사용할 수 있습니다 :

$array = array("one" => "apple", "two" => "orange", "three" => "pear");
end($array); 
echo key($array);

또 다른 해결책은 함수를 만들어서 사용하는 것입니다.

function endKey($array){
end($array);
return key($array);
}

$array = array("one" => "apple", "two" => "orange", "three" => "pear");
echo endKey($array);

1
이 답변은이 스레드에 아직없는 새로운 것을 제공하지 않습니다.
Martin

1
마틴, 아무도 결과를 얻기 위해 함수를 사용하지 않습니다.
Atif Tariq

1
함수에 한 줄의 코드를 추가해야합니까? 다소 불필요한 인터페이스입니다.
마틴

1
마틴, 한 줄.
Atif Tariq

2
기능의 선
마틴

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

2
하나의 값만 가져 오기 위해 전체 배열을 반대로하는 것은 PascalMARTIN의 방법보다 확실히 덜 효율적입니다. 기술적으로는 정확하지만 Pascal의 접근 방식 대신 사용해서는 안됩니다.
mickmackusa

3

방금 Xander에서 도우미 기능을 가져 와서 이전 답변으로 개선했습니다.

function last($array){
  $keys = array_keys($array);
  return end($keys);
}


$arr = array("one" => "apple", "two" => "orange", "three" => "pear");    
echo last($arr);
echo $arr(last($arr));

1

로 이것을 사용해보십시오 array_reverse().

 $arr = array(
     'first' => 01,
     'second' => 10,
     'third' => 20, 
 );  
 $key = key(array_reverse($arr));
 var_dump($key);

1

이상하지만, 왜이 주제에 이런 답이 없는지 :

$lastKey = array_keys($array)[count($array)-1];


0
$array = array(
    'something' => array(1,2,3),
    'somethingelse' => array(1,2,3,4)
);

$last_value = end($array);
$last_key = key($array); // 'somethingelse'

PHP가 $ array 내부적으로 배열 포인터를 이동하기 때문에 작동합니다.


2
이것은 PascalMARTIN의 방법과 중복됩니다. 이 페이지를 남겨두고 늦은 / 중복 답변을 삭제하십시오. 공감.
mickmackusa

0

인라인으로도 사용할 수있는 최상의 솔루션 :

end($arr) && false ?: key($arr)

이 솔루션은 표현 / 표현 일 뿐이며 최상의 성능을 제공하지는 않습니다.

인라인 예제 사용법 :

$obj->setValue(
    end($arr) && false ?: key($arr) // last $arr key
);


업데이트 : PHP 7.3 이상에서 : 새로 추가 된 array_key_last()메소드를 사용하십시오 (물론) .

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