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


154

연관 배열이 있고 키의 숫자 위치를 찾아야합니다. 배열을 수동으로 반복하여 찾을 수는 있지만 PHP에 더 좋은 방법이 있습니까?

$a = array(
  'blue'   => 'nice',
  'car'    => 'fast',
  'number' => 'none'
);

// echo (find numeric index of $a['car']); // output: 1

답변:


273
echo array_search("car",array_keys($a));

5
PHP는 연관 배열의 순서를 보장합니까?
케빈 버크

7
@KevinBurke 정렬 함수를 사용하지 않으면 다시 정렬하지 않습니다. 어떤 종류의 보증을 찾고 있는지 확실하지 않지만 연관 배열에 정적 순서가없는 JavaScript 모델과 다릅니다.
Fosco

6
"array_keys"에 의해 주어진 인덱스가 반드시 원래 배열의 인덱스와 일치하지는 않습니다. 예를 들어, "unset"또는 다른 여러 함수를 사용하여 배열을 변경 한 경우 원래 배열의 색인에 공백이 있지만 array_keys는 새 배열을 생성합니다.
SEoF

4
연관 배열이 혼합 된 경우에는 작동하지 않습니다. array("val1", "val2", "car" => "val3")0
왜냐하면



2

  $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)));



2

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)));

1
변수를 전달할 때 연관 배열에 0을 전달하면 동일한 부정적인 영향을 미치므로 문자열로 캐스트해야합니다. 예를 들어 : var_dump(array_search(0, array_map("strval", array_keys($a))));int (0)대신 항상 출력 bool (false)합니다.
Shaun Cockerill

@ShaunCockerill이 맞습니다! 이것을 지적 해 주셔서 감사합니다.
Xriuk

0

내가 생각해 낸 해결책 ... 아마도 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++;
   }
  }
 }

2
그렇습니다. PHP에는 수천 개의 내장 함수가 있습니다. 이것들은 보통 PHP 코드에서 먼 길을 썼던 동등한 논리보다 훨씬 빠릅니다.
Bill Karwin

3
이것은 아마보다도 빠르며 array_search, 먼저 정렬을 수행하므로 고통스럽게 느려집니다.
Alasdair

아, 그러나 내장 코드는 미리 컴파일되어 있으며 검색은 이진 검색 일 가능성이 높습니다 (항목을 먼저 정렬한다고 가정).
SEoF

0

array_keys 기반의 모든 솔루션은 혼합 배열에서 작동하지 않습니다. 해결책은 간단합니다.

echo array_search($needle,array_keys($haystack), true);

php.net에서 : 세 번째 매개 변수 strict가 TRUE로 설정되면 array_search () 함수는 건초 더미에서 동일한 요소를 검색합니다. 이것은 또한 건초 더미에서 바늘의 엄격한 유형 비교를 수행하고 객체는 동일한 인스턴스 여야 함을 의미합니다.

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