php-連想配列の数値インデックスを取得します


154

連想配列があり、キーの数値位置を見つける必要があります。配列を手動でループして見つけることもできますが、PHPに組み込むより良い方法はありますか?

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

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

回答:


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

5
PHPは連想配列の順序を保証しますか?
Kevin Burke

7
@KevinBurke並べ替え関数を使用しない限り、並べ替えは行われません。どのような種類の保証を探しているかはわかりませんが、連想配列に静的な順序がないJavaScriptモデルとは異なります。
Fosco、2012年

6
「array_keys」で指定されたインデックスは、元の配列のインデックスと必ずしも一致しません。たとえば、「unset」または他のいくつかの関数を使用して配列を変更した場合、元の配列のインデックスにギャップが残りますが、array_keysは新しい配列を生成します。
SEoF 2013

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はこの種の構文を許可していますが、1つの問題があります。Foscoのコードを実行0 すると、間違っているのですが、なぜこれが起こるのでしょうか。
文字列と整数間の比較やってたときなので、整数にPHPの変換文字列を(これは私の意見ではちょっと愚かである)、そのときarray_search()には最初のもので、インデックスの検索を停止して明らかにので("car" == 0) 本当です。strictモードに
設定array_search()しても問題は解決しませんarray_search("0", array_keys($a))。インデックス0の要素が存在する場合でもfalseが返されるためです。
したがって、私の解決策は、すべてのインデックスをarray_keys()から文字列に変換し、それらを正しく比較するだけです。

echo array_search("car", array_map("strval", array_keys($a)));

Prints 1、これは正しいです。

編集:
ショーンが以下のコメントで指摘したように、次のようなintインデックスを検索した場合、同じことがインデックス値に適用されます。

$a = array(
  "foo" => "bar",
  "nice",
  "car" => "fast",
  "none"
);
$ind = 0;
echo array_search($ind, array_map("strval", array_keys($a)));

常にを取得しますが0、これは誤りです。解決策は、インデックスを(変数を使用する場合)次のような文字列にキャストすることです。

$ind = 0;
echo array_search((string)$ind, array_map("strval", array_keys($a)));

1
変数を渡すときは、連想配列にゼロを渡すと同じ悪影響が生じるため、文字列としてキャストする必要もあります。たとえば、ではなく、var_dump(array_search(0, array_map("strval", array_keys($a))));常にが出力されます。int (0)bool (false)
Shaun Cockerill、2018年

@shaunCockerill正解です!これを指摘してくれてありがとう、私の答えを更新しました!
Xriuk

0

私が思いついた解決策...おそらくフォスコの解決策と比較してかなり非効率的です:

 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コードで長い道のりに書かれた同等のロジックよりもはるかに高速です。
ビルカーウィン2010

3
これはarray_search、が最初にソートを行うため、おそらく非常に高速で、非常に遅くなります。
Alasdair 2012年

ああ、でも組み込みのコードはプリコンパイルされているので、検索はおそらくバイナリ検索になります(最初にアイテムを並べ替えると仮定しています)。
SEoF 2013

0

array_keysに基づくすべてのソリューションは、混合配列では機能しません。解決策は簡単です:

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

php.netから:3番目のパラメーターstrictがTRUEに設定されている場合、array_search()関数はhaystack内の同一の要素を検索します。つまり、干し草の山の針の厳密な型比較も実行され、オブジェクトは同じインスタンスでなければなりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.