답변:
echo array_search("car",array_keys($a));
array("val1", "val2", "car" => "val3")
0
$blue_keys = array_search("blue", 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)));
var_dump(array_search(0, array_map("strval", array_keys($a))));
는 int (0)
대신 항상 출력 bool (false)
합니다.
내가 생각해 낸 해결책 ... 아마도 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_search
, 먼저 정렬을 수행하므로 고통스럽게 느려집니다.