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

我不知道这有多有效,但是:

$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 回答
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 回答
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

假设您希望键/值对处于每个/其他模式中,您可以使用:

$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 回答
0

@Rocket 片段的现代等价物是在foreach()循环中使用数组解构。

我的代码片段不使用“计数器”变量或进行任何迭代函数调用。

这将非常有效,因为只有 1 个函数调用来生成所需的结果。

代码:(演示

$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',
)
于 2020-10-18T12:56:01.927 回答
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 ); 
于 2020-10-18T18:53:12.557 回答