修改多维数组中的值,并将其作为新的键值对推送



我读到将新的键值对推入数组是没有意义的。但是,如何才能最好地解决这种情况呢?

我有一系列的导师和课程数据:

$data = [
['tutor_name' => 'John Doe', 'course_day' => 'Monday', ...],
['tutor_name' => 'John Doe', 'course_day' => 'Tuesday', ...]
...
];

我需要把所有的日子都翻译成我的语言(cz(,所以我写了一个开关:

function translate_to_cz ($day) {
switch ($day) {
case "Monday":
$day_cz = "Pondělí";
break;
case "Tuesday":
$day_cz = "Úterý";
break;
...
}
return $day_cz;
}

我需要一个循环,将$data['curse_day']发送到交换机。然后$day_cz将返回到原始数组,最好有一个新的关键字$data["curse_day_cz"]在等待它。这能做到吗?感谢

如何最好地解决这种情况?

好吧,您似乎想要执行值替换,所以创建一个查找并通过其键访问适当的替换。

不要用switch块膨胀脚本,只需创建一个查找数组,然后在迭代数据行时进行替换。您可以使用迭代函数或简单的foreach()循环。

代码:(Demo((PHP7.4以来的现代语法(

$enToCz = [
'Monday' => 'Pondělí',
'Tuesday' => 'Úterý'
];
$data = [
['tutor_name' => 'John Doe', 'course_day' => 'Monday',],
['tutor_name' => 'John Doe', 'course_day' => 'Tuesday',]
];
array_walk(
$data,
function (&$row) use ($enToCz) {
$row['course_day_cz'] = $enToCz[$row['course_day']];
}
);
/* or you can use:
foreach ($data as &$row) {
$row['course_day_cz'] = $enToCz[$row['course_day']];
}
*/
var_export($data);

输出:

array (
0 => 
array (
'tutor_name' => 'John Doe',
'course_day' => 'Monday',
'course_day_cz' => 'Pondělí',
),
1 => 
array (
'tutor_name' => 'John Doe',
'course_day' => 'Tuesday',
'course_day_cz' => 'Úterý',
),
)

语法解释:

变量前的
  1. CCD_ 3表示";通过引用修改";(如果你想做更多的研究,这是一个需要搜索的术语(。它允许变量中保存的数据直接发生突变。这是必要的;变量的副本";正在访问。

    在PHP中,每次更改原始数组值时都会有一些信息丰富的讨论。

  2. use()是一种用于将全局变量转移到自定义函数(闭包(范围内的技术。

    在PHP中,什么是闭包以及为什么使用";使用";标识符?


此外,array_map()可用于返回带有附加列的数组,而无需声明结果数组或修改原始数组。(演示(

var_export(
array_map(
fn($row) => $row + ['course_day_cz' => $enToCz[$row['course_day']]],
$data
)
);

您可以在$data上使用foreach循环,使用对该值的引用以便在循环中修改它,并对course_day值调用translate函数:

foreach ($data as &$value) {
$value['course_day_cz'] = translate_to_cz($value['course_day']);
}

3v4l.org 上的演示