연관 배열이 있고 키의 숫자 위치를 찾아야합니다. 배열을 수동으로 반복하여 찾을 수는 있지만 PHP에 더 좋은 방법이 있습니까?
$a = array(
'blue' => 'nice',
'car' => 'fast',
'number' => 'none'
);
// echo (find numeric index of $a['car']); // output: 1
답변
echo array_search("car",array_keys($a));
답변
$blue_keys = array_search("blue", array_keys($a));
답변
$a = array(
'blue' => 'nice',
'car' => 'fast',
'number' => 'none'
);
var_dump(array_search('car', array_keys($a)));
var_dump(array_search('blue', array_keys($a)));
var_dump(array_search('number', array_keys($a)));
답변
function arrayValuePosition($value, $array)
{
return array_search($value, array_keys($array));
}
답변
Fosco의 대답은 틀리지 않지만 이 배열을 고려할 경우가 있습니다 : 혼합 배열. 다음과 같은 배열이 있다고 상상해보십시오.
$a = array(
"nice",
"car" => "fast",
"none"
);
이제 PHP는 이런 종류의 구문을 허용하지만 한 가지 문제가 있습니다. Fosco의 코드를 실행하면 0
어떤 것이 잘못 되었습니까? 그러나 왜 이런 일이 발생합니까?
문자열과 정수를 비교할 때 PHP는 문자열을 정수로 변환 하기 때문에 (그리고 이것은 어리석은 말입니다) array_search()
인덱스를 검색하면 첫 번째 인덱스에서 멈추기 때문에 분명히 ("car" == 0)
true 입니다. 엄격 모드로
설정 array_search()
하면 문제가 해결되지 않습니다 array_search("0", array_keys($a))
. 인덱스가 0 인 요소가 존재하더라도 false를 반환 하기 때문 입니다.
따라서 내 솔루션은 모든 색인 array_keys()
을 문자열 로 변환 한 다음 올바르게 비교합니다.
echo array_search("car", array_map("strval", array_keys($a)));
인쇄 1
합니다. 맞습니다.
편집 :
Shaun은 아래 주석에서 지적했듯이 다음과 같이 int 인덱스를 검색하는 경우 인덱스 값에도 동일하게 적용됩니다.
$a = array(
"foo" => "bar",
"nice",
"car" => "fast",
"none"
);
$ind = 0;
echo array_search($ind, array_map("strval", array_keys($a)));
항상 get을 얻습니다 0
. 잘못되어 있으므로 솔루션은 색인을 변수를 사용하는 경우 다음과 같은 문자열로 캐스팅합니다.
$ind = 0;
echo array_search((string)$ind, array_map("strval", array_keys($a)));
답변
내가 생각해 낸 해결책 … 아마도 Fosco의 해결책과 비교하면 상당히 비효율적입니다.
protected function getFirstPosition(array$array, $content, $key = true) {
$index = 0;
if ($key) {
foreach ($array as $key => $value) {
if ($key == $content) {
return $index;
}
$index++;
}
} else {
foreach ($array as $key => $value) {
if ($value == $content) {
return $index;
}
$index++;
}
}
}
답변
array_keys 기반의 모든 솔루션은 혼합 배열에서 작동하지 않습니다. 해결책은 간단합니다.
echo array_search($needle,array_keys($haystack), true);
php.net에서 : 세 번째 매개 변수 strict가 TRUE로 설정되면 array_search () 함수는 건초 더미에서 동일한 요소를 검색합니다. 이것은 또한 건초 더미에서 바늘의 엄격한 유형 비교를 수행하고 객체는 동일한 인스턴스 여야 함을 의미합니다.