使用一个列作为键,另一个列作为值,从一组行的数组中生成一个关联数组。

3
我有一个MySQL结果集,每行有2个值。
每次循环这些结果时,我想将它们添加到一个数组中。
我希望其中一个值成为键,另一个值成为数组值。
我尝试了以下代码,但似乎没有效果:
$dataarray[] = $row['id'] => $row['data'];

如果我有:
$resultSet = [
    ['id' => 1, 'data' => 'one'],
    ['id' => 2, 'data' => 'two'],
    ['id' => 3, 'data' => 'three']
];

我想生成以下内容:
[
    1 => 'one',
    2 => 'two',
    3 => 'three'
]
3个回答

7
为什么不直接使用?
$dataarray[$row['id']] = $row['data'];

?


3
$dataarray[ $row['id'] ] = $row[ 'data' ];

2
使用array_column()代替foreach()在这个任务中更加优雅/具有表现力/现代化/简洁。
第一个参数是输入的行数组。 第二个参数是输出数组中要成为值的列。 第三个参数是输出数组中要成为键的列。
代码: (演示)
$array = [
    ['id' => 1, 'key' => 'foo', 'data' => 'a'],
    ['id' => 2, 'key' => 'bar', 'data' => 'b'],
    ['id' => 3, 'key' => 'barf', 'data' => 'c'],
];

var_export(
    array_column($array, 'data', 'id')
);

输出:

array (
  1 => 'a',
  2 => 'b',
  3 => 'c',
)

Laravel集合中对应的方法是pluck(),用法如下:

$collection->pluck('data', 'id')

如果你想要分配新的一级键,但是保持行不变,你可以在本地函数调用的第二个参数中写入null

代码: (演示)

var_export(
    array_column($array, null, 'id')
);

输出:

array (
  1 => 
  array (
    'id' => 1,
    'key' => 'foo',
    'data' => 'a',
  ),
  2 => 
  array (
    'id' => 2,
    'key' => 'bar',
    'data' => 'b',
  ),
  3 => 
  array (
    'id' => 3,
    'key' => 'barf',
    'data' => 'c',
  ),
)

一个较少被人注意到的、没有实际功能的技巧是在无需花括号的foreach()循环中使用数组解构。(演示

$array = [
    ['id' => 1, 'data' => 'a'],
    ['id' => 2, 'data' => 'b'],
    ['id' => 3, 'data' => 'c'],
];

$result = [];
foreach ($array as ['id' => $id, 'data' => $result[$id]]);
var_export($result);

这相当于早期的建议,即:
foreach ($array as $row) {
    $result[$row['id']] = $row['data'];
}

输出:

array (
  1 => 'a',
  2 => 'b',
  3 => 'c',
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接