我有一个简单的数组,其中键始终后跟值:
Array (
[0] => x
[1] => foo
[2] => y
[3] => bar
)
我想将其转换为关联的一个:
Array (
[x] => foo
[y] => bar
)
最简单,最优雅的方法是什么?
答案 0 :(得分:4)
节省内存,减少计算。
如果$ input数组具有奇数个值,则最后一个值将为NULL。
$result = array();
while (count($input)) {
$result[array_shift($input)] = array_shift($input);
}
答案 1 :(得分:2)
我不知道这有多高效,但是:
$newArray = array();
foreach(array_chunk($array, 2) as $keyVal){
list($key, $val) = $keyVal;
$newArray[$key] = $val;
}
答案 2 :(得分: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] =&gt; foo [y] =&gt; bar)
答案 3 :(得分: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"
}
答案 4 :(得分:1)
假设您希望键/值对位于每个/其他模式中,您可以使用:
$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;
作为循环中的第一行来规避。
答案 5 :(得分:1)
怎么样:
$data = array('x','foo','y','bar');
$i = 0;
$n = count($data)
$newData = array();
while($i < $n) {
$newData[$data[$i]] = $data[++$i];
}
答案 6 :(得分:0)
@Rocket片段的现代等效项是在foreach()
循环中采用数组解构。
我的代码段不使用“计数器”变量或进行任何迭代的函数调用。
这将非常有效,因为只有1个函数调用才能生成所需的结果。
代码:(Demo)
$array = ['x', 'foo', 'y', 'bar', 'z', 'zed'];
$result = [];
foreach (array_chunk($array, 2) as [$k, $v]) {
$result[$k] = $v;
}
var_export($result);
输出:
array (
'x' => 'foo',
'y' => 'bar',
'z' => 'zed',
)
答案 7 :(得分:0)
所以键的值是按照以下顺序排列的,即当我们为某个值放置键时,我们不需要该索引。我假设给定数组的键始终是整数,并且从0开始。
$array = ['x', 'foo', 'y', 'bar', 'z', 'zed'];
var_dump( $array);
$new = [];
foreach ($array as $key => $value) {
if( ($key % 2) === 1 )
$new[ $array [ $key-1 ] ] = $value;
}
var_dump( $new );