[php] PHP-연관 배열의 숫자 인덱스를 얻습니다

연관 배열이 있고 키의 숫자 위치를 찾아야합니다. 배열을 수동으로 반복하여 찾을 수는 있지만 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));

http://php.net/manual/en/function.array-keys.php


답변


  $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 () 함수는 건초 더미에서 동일한 요소를 검색합니다. 이것은 또한 건초 더미에서 바늘의 엄격한 유형 비교를 수행하고 객체는 동일한 인스턴스 여야 함을 의미합니다.