2011-06-18 17 views
34

数値インデックスを持つ配列値を取得します。PHP私のような配列を持っている

$array = array('foo' => 'bar', 33 => 'bin', 'lorem' => 'ipsum'); 
echo native_function($array, 0); // bar 
echo native_function($array, 1); // bin 
echo native_function($array, 2); // ipsum 

ので、このネイティブ関数は、連想キーを無視して探し、数値指標(第2引数)に基づいて値を返します配列内の実際の位置。

PHPでこれを行うためのネイティブ関数はありますか?それを書かなければなりませんか? おかげ

+3

これは悪い考えです。これは何のために必要なのですか?この場合、数値キーを実際に持たせることはあまり望ましくないでしょうか?サブ配列のメンバーとして 'foo'値を使用するのでしょうか? –

+0

私はまた、これは悪いデザインのように見えると思います。あなたがしようとしていることを教えてもらえますか?多分もっと良い解決策があるかもしれません。 – Alp

答えて

11

array_values()ほとんどあなたがやりたいことになります。

$numeric_indexed_array = array_values($your_array); 
// $numeric_indexed_array = array('bar', 'bin', 'ipsum'); 
print($numeric_indexed_array[0]); // bar 
+0

...そして、PHP 5.4のように、それを押しつぶす:print(array_values($ your_array)[0]); – Pancho

77
$array = array('foo' => 'bar', 33 => 'bin', 'lorem' => 'ipsum'); 
$array = array_values($array); 
echo $array[0]; //bar 
echo $array[1]; //bin 
echo $array[2]; //ipsum 
4

はい、スカラー値のため、implodearray_sliceの組み合わせが行います。

$bar = implode(array_slice($array, 0, 1)); 
$bin = implode(array_slice($array, 1, 1)); 
$ipsum = implode(array_slice($array, 2, 1)); 

するか、それを混ぜますarray_valueslist(ありがとう@nikic)それはすべてのタイプの値で動作するように:

list($bar) = array_values(array_slice($array, 0, 1)); 
+0

+1スカラー値の制限を取り除くために 'list($ bar)= array_slice($ array、0、1)'を使っていましたが、 – NikiC

+0

@nikic:残念ながら、 'array_slice'は文字列を保存しますキーが(* preserve_keys *が* false *であっても)、結果の配列を 'array_values'しなければ' list'を使うことはできません。とにかく、私はそれが解決策でもあり、編集されていると思います。ありがとう。 – netcoder

4

私はそれが直接get関数はないと思うので、私は、任意の欠点array_values()機能に対してそれについての私の考えを提案しています。 このようにして、数値的に配列された値のコピーを作成し、アクセスする必要があります。 PHPが目的の要素の位置にある整数を自動的に変換するメソッドを隠していない場合は、ほんの少し優れた解決法は、目的の位置になるまでカウンタを使って配列を実行し、到達した要素を返す関数。

アルゴリズムは非常に大きなインデックス配列のために最適化されるため、小さなインデックスはすぐに停止します。しかし、array_values()のハイライト表示された解決策では、たとえ、例えば$ array [1]にアクセスしなければならない場合でも、配列全体を循環するサイクルと関係があります。

function array_get_by_index($index, $array) { 

    $i=0; 
    foreach ($array as $value) { 
     if($i==$index) { 
      return $value; 
     } 
     $i++; 
    } 
    // may be $index exceedes size of $array. In this case NULL is returned. 
    return NULL; 
} 
+0

しかし、 'false'がフェッチされた値の場合はどうなりますか? 'null'を返すことはまだ悪いが、' false'よりも良いでしょう。 – user619271

+0

型の一貫性を考慮すると、値NULLを取得するか、入力インデックスが配列のサイズを超えた場合、またはインデックス入力のターゲット値がNULLの場合。この場合、私はあなたに同意します。しかし、FALSEとNULLは、関数empty()に対して同じ結果を返します。これは、次のチェックがどのようなシナリオで実行されるにしても、この関数を呼び出すのが理にかなっています。 –

関連する問題