キーの後に常に値が続く単純な配列があります。
Array (
[0] => x
[1] => foo
[2] => y
[3] => bar
)
連想に変換したい:
Array (
[x] => foo
[y] => bar
)
これを行う最も簡単でエレガントな方法は何ですか?
キーの後に常に値が続く単純な配列があります。
Array (
[0] => x
[1] => foo
[2] => y
[3] => bar
)
連想に変換したい:
Array (
[x] => foo
[y] => bar
)
これを行う最も簡単でエレガントな方法は何ですか?
メモリ効率を高め、計算量を減らす。
$input 配列の値の数が奇数の場合、最後の値は NULL になります。
$result = array();
while (count($input)) {
$result[array_shift($input)] = array_shift($input);
}
$ar = Array("x","foo","y","bar");
$assoc = Array();
for($i=0;$i<count($ar);$i+=2){$assoc[$ar[$i]]=$ar[$i+1];}
print_r($assoc);
出力: 配列 ( [x] => foo [y] => bar )
これがどれほど効率的かはわかりませんが、次のとおりです。
$newArray = array();
foreach(array_chunk($array, 2) as $keyVal){
list($key, $val) = $keyVal;
$newArray[$key] = $val;
}
単純な for ループから始めます
$arr = array(
'x',
'foo',
'y',
'bar'
);
$result = array();
$end = count($arr);
for ($i = 0; $i+1 < $end; $i+=2) {
$result[$arr[$i]] = $arr[$i+1];
}
var_dump($result);
出力:
array(2) {
["x"]=> string(3) "foo"
["y"]=> string(3) "bar"
}
キー/値のペアをevery/otherパターンにしたい場合は、次を使用できます。
$data = array('x', 'foo', 'y', 'bar', 'z');
$new = array();
$end = count($data);
for ($i = 0; $i < $end; $i += 2) {
$new[$data[$i]] = (isset($data[$i + 1]) ? $data[$i + 1] : '');
}
print_r($new);
あげる:
Array
(
[x] => foo
[y] => bar
[z] =>
)
これにより、データのリストが繰り返され、最初の値がキーとして設定され、次の値が値として設定されます。「次の」値がない場合 (つまり、2 で割り切れない元の配列の最後の項目)、それは空です。
このアプローチの注意点は、同じ「キー」が複数回見られると上書きされることです。if (isset($new[$data[$i]])) continue;
これは、ループの最初の行として を追加することで回避できます。
どうですか:
$data = array('x','foo','y','bar');
$i = 0;
$n = count($data)
$newData = array();
while($i < $n) {
$newData[$data[$i]] = $data[++$i];
}