5

キーの後に常に値が続く単純な配列があります。

Array (
    [0] => x
    [1] => foo
    [2] => y
    [3] => bar
)

連想に変換したい:

Array (
    [x] => foo
    [y] => bar
)

これを行う最も簡単でエレガントな方法は何ですか?

4

8 に答える 8

5

メモリ効率を高め、計算量を減らす。

$input 配列の値の数が奇数の場合、最後の値は NULL になります。

$result = array();

while (count($input)) {
    $result[array_shift($input)] = array_shift($input);
}
于 2012-11-01T17:48:06.240 に答える
2
$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 )

于 2012-11-01T17:57:14.163 に答える
2

これがどれほど効率的かはわかりませんが、次のとおりです。

$newArray = array();
foreach(array_chunk($array, 2) as $keyVal){
    list($key, $val) = $keyVal;
    $newArray[$key] = $val;
}

デモ: http://codepad.org/VF8qHAhQ

于 2012-11-01T17:45:08.737 に答える
1

単純な 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"
}
于 2012-11-01T17:44:39.660 に答える
1

キー/値のペアを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;これは、ループの最初の行として を追加することで回避できます。

于 2012-11-01T17:45:37.193 に答える
1

どうですか:

$data = array('x','foo','y','bar');
$i = 0;
$n = count($data)
$newData = array();
while($i < $n) {
    $newData[$data[$i]] = $data[++$i];
}
于 2012-11-01T17:46:57.587 に答える