PHPの整数インデックスによる連想配列へのアクセス


92

キーと値のペアの配列インデックスを使用して、連想配列の値を設定したいのですが。例えば:

$my_arr = array( "bling" => "some bling", "bling2" => "lots O bling" );
$my_arr[1] = "not so much bling";  // Would change the value with key bling2.

キー文字列を使用せずにこれを実現するにはどうすればよいですか?

回答:


188

array_keysを使用します。

$keys = array_keys($my_arr);
$my_arr[$keys[1]] = "not so much bling";

お役に立てれば。


4
余談ですが、なぜPHP開発者は配列にアクセスするためにそのような非直感的な方法を作成するのでしょうか?
Marty

3
@Martyこれは、PHP開発者による実装方法とはあまり関係がありませんが、配列がどのように機能するかについての誤解によります。技術的には、上記はまだ連想名を使用しています。数値と連想索引キーの間には相関関係はありません。
Gordon

2
連想配列を作成するのは、配列内での位置よりも探しているものが重要だからです。これは良い点だと思います。学生の名前をキー、住所を値とする配列があるとします。名前で生徒の住所にアクセスできます。配列の位置は関係ありません。そして、配列をでソートできますname of the student
ドノバン

@Gordon技術的には真実です。しかし、プログラマーは文字列ではなく数値を提供しています。これがの意味だと思いますwithout using a key string
ドノバン

2
@Albertこの番号を適切なキー文字列にマッピングしています。しかし、それはそれを意味しarray[1] === $array['foo']ません。配列には、別の値がまだ含まれている可能性があります$array[1]。私はあなたの解決策が間違っているとは言っていないことに注意してください。これはOPの前提です。
Gordon

27

数値と連想索引キーの間には相関関係はありません。

key / valueの配列インデックスを使用して連想配列の値設定する場合は、指定されたキーを使用する必要があります。設定$array[1]はsetting と同じではありません$array['foo']

この配列を検討してください

print_r( array('foo', 'foo' => 'bar', 'baz', 'some' => 'value') );

これは

Array
(
    [0] => foo
    [foo] => bar
    [1] => baz
    [some] => value
)

fooは配列の2番目の要素です。これはオフセットですが、インデックス1とは関係ありません。ご覧のとおり、上記の配列では、インデックス1はに関連付けられていbazます。foo最初の連想キーだからといって、実際の数値キー1とは何か関係があると仮定するのは誤りsomeです。

同様に、上記のような混合配列の場合、array_keysこのサイトの他の場所で提案されているソリューションは機能しません。

print_r( array_keys(array('foo', 'foo' => 'bar', 'baz', 'some' => 'value')) );

あげる

Array
(
    [0] => 0
    [1] => foo
    [2] => 1
    [3] => some
)

だからあなたが$array[$keys[1]]するとき、あなたは本当にやってい$array['foo']ます。しかし、その配列('some')の2番目の連想値にアクセスしたい場合は$array[$keys[2]]、それがに評価され$array[1]、それがであるため、アクセスできませんbaz

要素のオフセットは、要素のキーまたは値とはまったく無関係です

print_r(
    array(
        100    => 'foo',
        'foo'  => 'bar',
        50     => 'baz',
        'some' => 'value'
    )
);

本当に意味する

Array
( //key       value     offset/position
    [100]  => foo       // 0
    [foo]  => bar       // 1
    [50]   => baz       // 2
    [some] => value     // 3
)

つまり、オフセット0の要素はキーは100ですがfooです。オフセットによって配列から要素を抽出する場合は、

$third = array_splice($array, 2, 1);
echo $third[0]; // baz

これにより、3番目の位置にある要素のみを保持する配列が作成されます。

または、を使用することもできますArrayIteratorArrayIterator実装Seekableあなたが特定の位置をシークすることができますインターフェイスは/配列内のオフセットし、そのフェッチ:

$iterator = new ArrayIterator($array);
$iterator->seek(3);
echo $iterator->current(); // value

マイナーNIT: 「あなたは( 『一部』)その配列の2番目の連想値にアクセスしたい場合、あなたは$配列[$キー[2]それはのバズ$配列[1]にしていることを評価しますので、実行できません」 技術を、これは、数値キーを含むすべてのキーが連想キーである、から返される4つの値だからarray_keysです。「非連想キー」のようなエンティティはありません。(キー配列に文字列のみが含まれていると想定して)2番目の文字列キーを返すことができないことを指摘するつもりなら、そのとおりです。$stringKeys = array_filter(array_keys($array), "is_string");文字列キーを与えます。
ToolmakerSteve

17

array_keys()n番目のキーへのアクセスを許可しながらarray_values、n番目の値を提供します。

<?php
$array = [
   0     => 'Zero',
   '1'   => 'One',
   'Two' => 'Two',
];
echo array_values($array)[2];
?>

「2」を出力します。

どちらか一方の利点はありますか?まあ、私が見ることができる唯一のマイナーなものは、配列アクセスの数です。

array_keys()する必要があります3。

  1. データ配列からキーを取得します。
  2. キーのリストからn番目のキーを取得します。
  3. データ配列からn番目のキーを使用して値を取得します。

ではarray_values()、必要なのは2つだけです。

  1. データ配列から値を取得します。
  2. 値のリストからn番目の値を取得します。

しかし、その一方で、キーは通常小さく、データは非常にネストされる可能性があるため、バランスをとって、array_keys()おそらく安全です。


3

アレイが大きい場合は、両方array_keysarray_valuesそれらがちょうど得るために、オリジナルと同じサイズの新しい配列を割り当てるので無駄になり、n番目のキー(または値)。

array_slice整数オフ​​セットを受け入れ、連想配列で機能します。これを使用して、一定の時間でn番目のキーを取得(および設定)できます。

// This will at most allocate 2 temporary arrays of 1 element each
$key = array_keys(array_slice($array, $n, 1, true))[0];

$array[$key] = $value;

2
ここに素晴らしい解決策があります!
Daan

1

これを試して。それはあなたのために働きます。

$result= array_values($my_arr); // Array with indexes you need

1
すでにいくつかの回答と承認された回答がある古いスレッドに投稿するときは注意してください。新しい答えが既存の答えよりも優れている理由を説明する必要があります。
APC

0

別の可能性は、それを通常の配列に変換することです:

$ arraybuff = implode( "~~~"、$ my_arr);
$ my_arr = explode( "~~~"、$ arraybuff);

「~~~」は、データで発生しない区切り文字です。

これで、オフセットと等しい数値インデックスを使用して配列にアクセスできます。

連想配列を保持する必要がある場合は、それを別の変数に割り当てます。


常に考慮しなければならないので、この正確な区切り文字はデータで発生する可能性があるため、このアイデアは99.9999999%で機能します。100%動作するいくつかのソリューションがあります。さらに、これにより、プロセッサが大量の作業に設定され、単純な配列アクセスのためにメモリが無駄になります。
user426486
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.