我有一个看起来像这样的数组:
$array = [
[
'title' => 'Ireland - Wikipedia, the free encyclopedia',
'url' => 'http://example.com/wiki/Ireland'
],
[
'title' => 'Ireland\'s home for accommodation, activities.',
'url' => 'http://www.example.com/'
]
];
我想向每行添加一个值为 0 的
score
元素。我以为这个简单的 foreach 循环就可以解决问题,但是……嗯……事实并非如此。 :/
public function setScore($result)
{
foreach($result as $key)
{
$key = array('title', 'url', 'score' => 0);
}
return $result;
}
有人可以帮我吗?
foreach
适用于数组的 copy。您可以随意修改$key
,它不会反映在原始数组上。
您可以使用
$key
通过参考,然后它会按预期工作:
foreach ($result as &$value) {
$value['score'] = 0;
}
您在此处创建一个新数组,但不对其执行任何操作:
foreach($result as $key){
$key = array('title', 'url', 'score' => 0);
}
您想要做的是修改对现有引用的引用:
foreach($result as &$key){ # Note the '&' here
$key['score'] = 0;
}
array_walk()
来完成此操作,如下所示:
array_walk( $result, function( &$el) { $el['score'] = 0; });
这是如何实现此目的的示例。
$array = array( array( 'title' => "Ireland - Wikipedia, the free encyclopedia", 'url' => "http://en.wikipedia.org/wiki/Ireland"), array( 'title' => "Ireland's home for accommodation, activities.", 'url' => "http://www.ireland.com/" ) );
function setScore( $result )
{
foreach( $result as &$element )
{
$element['score'] = 0;
}
return $result;
}
$array = setScore( $array );
print_r( $array );
你也可以这样做:
function setScore( &$result )
{...}
然后就:
setScore( $array );
对于将具有静态值的新列附加到二维数组的所有关联行的任务,有多种可行的方法。 以下所有内容都将创建一个具有相同所需结果的数组。我将避免重复已经发布的确切技术。
下面的一些脚本使用数组并集运算符 (
+
) 或数组并集赋值运算符 (+=
) 合并关联数据。
使用
array_map()
使用扩展数据创建一个新数组。 演示
var_export(
array_map(
fn($row) => $row + ['score' => 0],
$array
)
);
使用
array_walk()
按行进行修改。 演示
array_walk(
$array,
fn(&$row) => $row['score'] = 0
);
var_export($array);
或者传入静态元素作为第三个参数。 演示
array_walk(
$array,
fn(&$row, $_, $new) => $row += $new,
['score' => 0]
);
var_export($array);
在
foreach()
循环内通过引用修改行。 +=
的行为与仅仅分配元素不同,因为如果 score
元素已经存在,则不会被覆盖。如果仅在未声明或值为 null 时才需要分配值,请使用 $row['score'] ??= 0;
Demo
foreach ($array as &$row) {
$row += ['score' => 0];
}
var_export($array);
对称数组解构语法也可用于避免访问与操作无关的数据。 演示
foreach ($array as ['score' => &$s]) {
$s = 0;
}
var_export($array);