배열이 있습니다.
array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )
이 배열의 첫 번째 요소를 얻고 싶습니다. 예상 결과 : 문자열 apple
한 요구 사항 : 참조에 의해 전달 수행 할 수 없습니다 때문에, array_shift
좋은 솔루션이 아닙니다.
어떻게해야합니까?
&$array
매개 변수로 사용 하면 기능이 작동하지 않아야합니다 .
배열이 있습니다.
array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )
이 배열의 첫 번째 요소를 얻고 싶습니다. 예상 결과 : 문자열 apple
한 요구 사항 : 참조에 의해 전달 수행 할 수 없습니다 때문에, array_shift
좋은 솔루션이 아닙니다.
어떻게해야합니까?
&$array
매개 변수로 사용 하면 기능이 작동하지 않아야합니다 .
답변:
원래 답변이지만 비용이 많이 든다 (O (n)) :
array_shift(array_values($array));
O (1)에서 :
array_pop(array_reverse($array));
기타 사용 사례 등
(배열 포인터 재설정의 의미에서) 수정 $array
이 문제가 아닌 경우 다음을 사용할 수 있습니다.
reset($array);
배열 "복사"가 필요한 경우 이론적으로 더 효율적이어야합니다.
array_shift(array_slice($array, 0, 1));
PHP 5.4+ 사용시 (비어 있으면 색인 오류가 발생할 수 있음) :
array_values($array)[0];
list()
그리고 reset()
내 의견에 훨씬 더 좋은 솔루션입니다.
Mike가 지적한대로 (가장 쉬운 방법) :
$arr = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )
echo reset($arr); // Echoes "apple"
키를 얻으려면 (재설정 후 실행)
echo key($arr); // Echoes "4"
에서 PHP의 설명서 :
혼합 재설정 (배열 & $ array );
기술:
reset () 은 첫 번째 요소에 대한 배열의 내부 포인터를 되 감고 첫 번째 배열 요소의 값을 반환하거나 배열이 비어 있으면 FALSE를 반환합니다.
foreach
대상 배열과 함께이 작업을 수행하면 문제가 해결 됩니다.
foreach
는 반복되는 배열을 복사합니다.
key($arr)
를하면 '4'를 얻을 것입니다 (응답에 추가됨)
reset()
. 2) 아니요, foreach는 어레이의 복사본을 만들지 않습니다 !!! 그것은 단지 자신의 포인터를 만듭니다 (기존 포인터의 사본조차도 아닙니다 next()
-foreach 전에 호출하기도 쉽습니다 ).
$first_value = reset($array); // First element's value
$first_key = key($array); // First element's key
$arr = array( 9 => 'apple', 7 => 'orange', 13 => 'plum' );
echo reset($arr); // echoes 'apple'
현재 포인터 위치를 잃지 않으려면 배열의 별칭을 만드십시오.
reset()
이미 첫 번째 요소를 반환하므로 사용할 필요가 없습니다 current()
– echo reset($arr)
충분해야합니다
current
하는 reset
PHP 공지 / 참조 경우에 발생 오류, 예를 방지하기 current(array_filter(...));
에 3v4l을 .
current($array)
PHP manual에 따르면 배열의 첫 번째 요소를 얻을 수 있습니다 .
모든 배열에는 배열에 삽입 된 첫 번째 요소로 초기화되는 "현재"요소에 대한 내부 포인터가 있습니다.
따라서 배열 포인터를 재배치 할 때까지 작동합니다. 그렇지 않으면 배열을 재설정해야합니다.
current($array)
배열 포인터가 "현재"첫 번째 요소를 가리키는 경우에만 작동 reset($array)
합니다. 그렇지 않으면 필요합니다.
current()
는 PHP 문서는이를 반영하지 않지만, 더 이상 참조가 필요합니다. 그래서 이것이 최선의 해결책이라고 생각합니다.
언어 구조 "list"로 N 번째 요소를 얻을 수 있습니다.
// First item
list($firstItem) = $yourArray;
// First item from an array that is returned from a function
list($firstItem) = functionThatReturnsArray();
// Second item
list( , $secondItem) = $yourArray;
이 array_keys
기능을 사용하면 키에 대해 동일한 작업을 수행 할 수 있습니다.
list($firstKey) = array_keys($yourArray);
list(, $secondKey) = array_keys($yourArray);
list($first_value) = $my_array;
제 생각에는 가장 좋은 옵션입니다. 여기에 제시된 다른 답변의 문제는 없습니다. "오버 킬"은 복사 또는 배열을 만들거나 새로운 것을 만들지 않기 때문에 "과잉 행동"이 없습니다. "참조"없음 : 배열이 수정되지 않습니다. 없음 "리셋 없다"배열의 내부 포인터 변경없이 ...
int
하고 시도 list($firstItem) = array('key1' => 'value1');
하면 오류가 발생합니다Notice: Undefined offset: 0
list($x) = foo();
와 같습니다 $x = foo()[0];
. 정수 인덱스 배열조차 키 0의 요소를 가질 수 없기 때문에 이것이 "첫 번째 항목 가져 오기"와 반드시 동일하지는 않습니다. 필자의 경우 "list ($ order) = get_order ($ user) ; " 그러나 "get_order"는 일반적으로 0이 아닌 ID로 키를 입력 한 주문을 반환했습니다. @Sergiy가 말했듯이 array_values ()는이를 해결하지만 코드의 효율성과 (가장 중요한) 가독성을 떨어 뜨립니다.
PHP 7.3 은 원래 배열을 수정하거나 임시 객체를 만들지 않고 직접 배열의 첫 번째 키와 마지막 키를 가져 오는 두 가지 기능을 추가했습니다 .
의미 적으로 의미있는 것 외에도 이러한 함수는 배열 포인터를 움직이지 않습니다 foreach
.
키가 있으면 키로 직접 값을 얻을 수 있습니다.
$my_array = ['IT', 'rules', 'the', 'world'];
$first_key = array_key_first($my_array);
$first_value = $my_array[$first_key];
$last_key = array_key_last($my_array);
$last_value = $my_array[$last_key];
$first_value = $my_array[ array_key_first($my_array) ];
$last_value = $my_array[ array_key_last($my_array) ];
$first_value = empty($my_array) ? 'default' : $my_array[ array_key_first($my_array) ];
$last_value = empty($my_array) ? 'default' : $my_array[ array_key_last($my_array) ];
다음을 가정하십시오.
$array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
그냥 사용하십시오 :
$array[key($array)]
첫 번째 요소를 얻거나
key($array)
첫 번째 키를 얻을 수 있습니다.
또는 제거하려는 경우 첫 번째 링크를 해제 할 수 있습니다.
current
그렇다면 단순히 사용하지 않습니까?
일부 배열 함수처럼 작동하지 않습니다 list
, reset
또는 current
. 어쩌면 그것들은 "가짜"배열 일 수도 있습니다-예를 들어 부분적으로 ArrayIterator를 구현합니다.
배열에 관계없이 첫 번째 값을 가져 오려면 반복자를 단락시킬 수 있습니다.
foreach($array_with_unknown_keys as $value) break;
그런 다음 값을 사용할 수 있으며 $value
첫 번째 반복 후에 루프가 중단됩니다. 이것은 잠재적으로 큰 배열을 array_unshift (array_values ($ arr))와 같은 함수에 복사하는 것보다 효율적입니다.
이 방법으로 키를 잡을 수도 있습니다.
foreach($array_with_unknown_keys as $key=>$value) break;
함수에서 이것을 호출하는 경우 간단히 반환하십시오.
function grab_first($arr) {
foreach($arr as $value) return $value;
}
라 라벨의 도우미들로부터 :
function head($array)
{
return reset($array);
}
배열이 값으로 함수에 전달되면 reset () 은 배열 사본의 내부 포인터에 영향을 미치며 원래 배열에 닿지 않습니다 ( false
배열이 비어 있으면 반환 됨 ).
사용 예 :
$data = ['foo', 'bar', 'baz'];
current($data); // foo
next($data); // bar
head($data); // foo
next($data); // baz
또한 여기에 대안이 있습니다. 그건 아주 소폭 빠르게,하지만 더 흥미 롭군요. 배열이 비어 있으면 쉽게 기본값을 변경할 수 있습니다.
function head($array, $default = null)
{
foreach ($array as $item) {
return $item;
}
return $default;
}
레코드 의 경우 배열의 마지막 요소에 대한 또 다른 대답이 있습니다.
이것을 단순하게 유지하십시오! 여기에는 많은 정답이 있지만 모든 혼란을 최소화하기 위해이 두 가지 작업을 수행하고 많은 오버 헤드를 줄입니다.
key($array)
배열의 첫 번째 키를
current($array)
얻습니다 배열 의 첫 번째 값을 얻습니다
편집 :
아래 의견에 대해. 다음 예제는 출력됩니다 :string(13) "PHP code test"
$array = array
(
'1' => 'PHP code test',
'foo' => 'bar', 5 , 5 => 89009,
'case' => 'Random Stuff: '.rand(100,999),
'PHP Version' => phpversion(),
0 => 'ending text here'
);
var_dump(current($array));
current
현재 요소와 같습니다. 배열이 실제로 시작되도록 배열의 시작 부분으로 포인터를 재설정해야합니다.
간단히 :
array_shift(array_slice($array,0,1));
나는 할 것이다 echo current($array)
.
current()
비 참조가 전달 될 때 오류가 발생하지 않습니다. 포인터가 여전히 시작 부분에 있다면 작동합니다.
reset
는 "변수 만 참조로 전달해야합니다"라는 알림을 표시하지만 다음과 같은 경우 current
는 아닙니다. Online PHP Editor example ofcurrent(array_filter(...));
.
next()
, end()
또는 수정 배열의 내부 포인터가 다른 기능. 내 예제 current()
에서 내부 포인터가 배열의 "범위를 벗어남"때문에 null을 반환합니다. 그러나 그것은 '가상'으로 임의의 / 무작위 요소를 가리킬 수도 있습니다.
$myArray = array (4 => 'apple', 7 => 'orange', 13 => 'plum');
$arrayKeys = array_keys($myArray);
// The first element of your array is:
echo $myArray[$arrayKeys[0]];
$array=array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
$firstValue = each($array)[1];
이보다 훨씬 효율적입니다 array_values()
each()
함수가 전체 배열을 복사하지 않기 때문에이 방법 입니다.
자세한 내용은 http://www.php.net/manual/en/function.each.php를 참조하십시오 .
클루 지 방식은 다음과 같습니다.
$foo = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
function get_first ($foo) {
foreach ($foo as $k=>$v){
return $v;
}
}
print get_first($foo);
reset()
되기 전에 배열 포인터가 재설정되는 것처럼 사용할 수도 있습니다 foreach
.
첫 번째 요소를 얻으십시오.
array_values($arr)[0]
마지막 요소 얻기
array_reverse($arr)[0]
이 작업의 대부분! 빠른 단일 회선 (낮은 리소스) 호출의 경우 :
$array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
echo $array[key($array)];
// key($array) -> will return the first key (which is 4 in this example)
이것이 효과가 있고 잘 작동하지만 추가 답변을 참조하십시오 : https : //.com/a/48410351/1804013
current($array)
어쨌든 배열의 내부 포인터가 첫 번째 요소에 있어야하는 을 사용하는 것과 같습니다 .이 경우 echo reset($array)
가장 적합합니다.
array_values를 사용하는 것이 가장 좋습니다. 해당 함수의 결과에서 인덱스 0의 값을 반환하여 'apple'을 얻을 수 있습니다.
이것은 게임에 약간 늦었지만 내 배열에 배열 요소가 자식으로 포함 된 문제가 발생하여 첫 번째 배열 요소의 문자열 표현을 얻을 수 없었습니다. PHP의 current()
기능 을 사용하여 이것을 관리했습니다.
<?php
$original = array(4 => array('one', 'two'), 7 => array('three', 'four'));
reset($original); // to reset the internal array pointer...
$first_element = current($original); // get the current element...
?>
현재의 모든 솔루션 덕분 에이 답변에 도달하는 데 도움이되었습니다.
두 가지 솔루션.
해결 방법 1-키를 사용하십시오. 사용할 수 없다고 말하지 않았습니다. :)
<?php
// Get the first element of this array.
$array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
// Gets the first element by key
$result = $array[4];
// Expected result: string apple
assert('$result === "apple" /* Expected result: string apple. */');
?>
해결 방법 2-array_flip () + key ()
<?php
// Get first element of this array. Expected result: string apple
$array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
// Turn values to keys
$array = array_flip($array);
// You might thrown a reset in just to make sure
// that the array pointer is at the first element.
// Also, reset returns the first element.
// reset($myArray);
// Return the first key
$firstKey = key($array);
assert('$firstKey === "apple" /* Expected result: string apple. */');
?>
해결 방법 3-array_keys ()
echo $array[array_keys($array)[0]];
이것은 현실 세계에서 그렇게 간단한 반응이 아닙니다. 일부 라이브러리에서 찾을 수있는 가능한 응답의 예가 있다고 가정하십시오.
$array1 = array();
$array2 = array(1,2,3,4);
$array3 = array('hello'=>'world', 'foo'=>'bar');
$array4 = null;
var_dump('reset1', reset($array1));
var_dump('reset2', reset($array2));
var_dump('reset3', reset($array3));
var_dump('reset4', reset($array4)); // Warning
var_dump('array_shift1', array_shift($array1));
var_dump('array_shift2', array_shift($array2));
var_dump('array_shift3', array_shift($array3));
var_dump('array_shift4', array_shift($array4)); // Warning
var_dump('each1', each($array1));
var_dump('each2', each($array2));
var_dump('each3', each($array3));
var_dump('each4', each($array4)); // Warning
var_dump('array_values1', array_values($array1)[0]); // Notice
var_dump('array_values2', array_values($array2)[0]);
var_dump('array_values3', array_values($array3)[0]);
var_dump('array_values4', array_values($array4)[0]); // Warning
var_dump('array_slice1', array_slice($array1, 0, 1));
var_dump('array_slice2', array_slice($array2, 0, 1));
var_dump('array_slice3', array_slice($array3, 0, 1));
var_dump('array_slice4', array_slice($array4, 0, 1)); // Warning
list($elm) = $array1; // Notice
var_dump($elm);
list($elm) = $array2;
var_dump($elm);
list($elm) = $array3; // Notice
var_dump($elm);
list($elm) = $array4;
var_dump($elm);
당신이 볼 수 있듯이, 우리는 경우에 따라 잘 작동하지만 전부는 아닙니다.
내 의견으로는, 당신은 그 배열 만 배열로 처리해야합니다.
이제 우리가 항상 다음과 같이 배열한다고 가정하면 성능에 대해 이야기합니다.
$elm = empty($array) ? null : ...($array);
...you would use without errors:
$array[count($array)-1];
array_shift
reset
array_values
array_slice
array_shift
보다 빠른 인 reset
, 이들 세보다 빠른 -보다 [1 카운트 ()보다 빠른 것, array_values
및 array_slice
.
필자는 저자 가 STRICT "변수 만 참조로 전달해야"하지 않고 일부 함수 ( 예 : mysql_fetch_row) 에서 배열의 첫 번째 요소를 가져 오는 방법을 찾고 있다고 생각합니다 .
그렇다면 여기에 설명 된 거의 모든 방법 이이 메시지를 얻습니다. 그중 일부는 배열 (또는 그 일부)을 복제하는 많은 추가 메모리를 사용합니다. 이를 피하는 쉬운 방법은 해당 함수를 호출하기 전에 인라인 값을 지정하는 것입니다.
$first_item_of_array = current($tmp_arr = mysql_fetch_row(...));
// or
$first_item_of_array = reset($tmp_arr = func_get_my_huge_array());
이렇게하면 화면이나 로그에 STRICT 메시지가 표시되지 않으며 추가 배열을 만들지 않습니다. 인덱스 배열 과 연관 배열 모두에서 작동 합니다.
"목록"예제가 마음에 들지만 "목록"은 과제의 왼쪽에서만 작동합니다. 변수를 할당하지 않으려면 임시 이름을 작성해야합니다. 임시 이름은 최대한 범위를 오염시키고 최악의 경우 기존 값을 덮어 씁니다.
list($x) = some_array();
var_dump($x);
위의 값은 기존의 $ x 값을 덮어 쓰며 $ x 변수는이 범위가 활성화되어있는 한 (이 함수 / 방법의 끝이거나 최상위에있는 경우 영원히) 중단됩니다. 이것은 call_user_func와 익명 함수를 사용하여 해결할 수는 있지만 어수선합니다.
var_dump(call_user_func(function($arr) { list($x) = $arr; return $x; },
some_array()));
이와 같은 익명 함수를 사용하면 참조 및 전달을 사용하더라도 reset 및 array_shift로 실제로 벗어날 수 있습니다. 함수를 호출하면 인수가 바인드되므로이 인수는 참조로 전달 될 수 있습니다.
var_dump(call_user_func(function($arr) { return reset($arr); },
array_values(some_array())));
그러나 call_user_func가이 임시 할당을 내부적으로 수행하므로 실제로는 과도합니다. 이를 통해 참조 별 전달 함수를 경고 또는 오류없이 값별 전달 인 것처럼 처리 할 수 있습니다.
var_dump(call_user_func('reset', array_values(some_array())));
이 시도:
$fruits = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
echo reset($fruits)."\n";