キーと値のペアの配列インデックスを使用して、連想配列の値を設定したいのですが。例えば:
$my_arr = array( "bling" => "some bling", "bling2" => "lots O bling" );
$my_arr[1] = "not so much bling"; // Would change the value with key bling2.
キー文字列を使用せずにこれを実現するにはどうすればよいですか?
回答:
name of the student。
without using a key string。
array[1] === $array['foo']ません。配列には、別の値がまだ含まれている可能性があります$array[1]。私はあなたの解決策が間違っているとは言っていないことに注意してください。これはOPの前提です。
数値と連想索引キーの間には相関関係はありません。
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番目の位置にある要素のみを保持する配列が作成されます。
または、を使用することもできますArrayIterator。ArrayIterator実装Seekableあなたが特定の位置をシークすることができますインターフェイスは/配列内のオフセットし、そのフェッチ:
$iterator = new ArrayIterator($array);
$iterator->seek(3);
echo $iterator->current(); // value
array_keysです。「非連想キー」のようなエンティティはありません。(キー配列に文字列のみが含まれていると想定して)2番目の文字列キーを返すことができないことを指摘するつもりなら、そのとおりです。$stringKeys = array_filter(array_keys($array), "is_string");文字列キーを与えます。
array_keys()n番目のキーへのアクセスを許可しながらarray_values、n番目の値を提供します。
<?php
$array = [
0 => 'Zero',
'1' => 'One',
'Two' => 'Two',
];
echo array_values($array)[2];
?>
「2」を出力します。
どちらか一方の利点はありますか?まあ、私が見ることができる唯一のマイナーなものは、配列アクセスの数です。
とarray_keys()する必要があります3。
ではarray_values()、必要なのは2つだけです。
しかし、その一方で、キーは通常小さく、データは非常にネストされる可能性があるため、バランスをとって、array_keys()おそらく安全です。
アレイが大きい場合は、両方array_keysとarray_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;
別の可能性は、それを通常の配列に変換することです:
$ arraybuff = implode( "~~~"、$ my_arr);
$ my_arr = explode( "~~~"、$ arraybuff);
「~~~」は、データで発生しない区切り文字です。
これで、オフセットと等しい数値インデックスを使用して配列にアクセスできます。
連想配列を保持する必要がある場合は、それを別の変数に割り当てます。