2011-01-22 16 views
72

キー/値のペアの配列インデックスを使用して連想配列の値を設定します。例:PHPの整数インデックスによる連想配列へのアクセス

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

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

答えて

155

array_keysを使用してください。

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

希望します。

+2

魅力的な作品です。ありがとう。 – Marty

+3

PHPの開発者は、なぜ直感的ではない配列へのアクセス方法を作成するのでしょうか? – Marty

+1

@Martyこれは、PHP開発者が実装した方法とはあまり関係がありませんが、配列の仕組みについて誤解しています。技術的には、上記は連想的な名前を使用しています。数値索引キーと連想索引キーとの間には相関関係はありません。 – Gordon

23

数値キーと連想インデックスキーの間には相関がありません。

あなたがにしたいと言うのキー/値の配列インデックスを使用して連想配列の値を設定し、その後、あなたは$array[1]$array['foo']を設定することと同じではありません設定、与えられたキーを使用する必要があります。

このアレイ

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

を考えるこれはfooが配列の2番目の要素である

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

を与えます。これはオフセットですが、インデックス1とは関係ありません。上記の配列では、インデックス1はbazに関連付けられています。 fooが最初の連想キーであるという理由だけで、実際の数字キー1とは何の関係もないと仮定するのは間違いです。someは2に対応しません。

同様に、上記のような混合配列の場合、あなたが本当にを行っている$array[$keys[1]]を行う際

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

だから

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

を与えるためarray_keysとソリューションは、他の場所で動作しません、このサイト上で示唆しました。しかし、その配列('some')の2番目の結合値にアクセスする場合は、$array[$keys[2]]を実行することはできません。これは$array[1]と評価され、その値はbazとなるためです。それがキーまたは値だと要素のオフセット

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

は本当にそれがキーだが、0がfooであるオフセットでお場合は100です要素を意味している

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

意味は全く無関係ですオフセットによって配列から要素を抽出したい場合は、使用する必要があります。

Thi 3番目の位置にある要素だけを保持する配列を作成します。

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

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

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

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

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

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

連想配列を保持する必要がある場合は、別の変数に代入するだけです。

13

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()を使用する方が安全でしょう。

1

これを試してください。それはあなたのために働く。

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

既にいくつかの回答と受け入れられた回答がある古いスレッドに投稿する場合は注意してください。新しい答えが既存の答えよりも優れている理由を説明する必要があります。 – APC

+0

kありがとうございます。@ APC –

1

配列が大きい場合、彼らは単に n番目のキー(または値)を取得するために、元のように新しい配列と同じサイズを割り当てるので、array_keysarray_values両方が無駄になります。

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

// 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; 
関連する問題