将阵列连接在一起,但彼此交叉



我有三个这样的数组

$wages = array("Tom" => "£20", "Mike" => "£5.60", "James" => "12");
$training = array("Tom" => "£2", "James" => "7", "Dean" => "£3.50");
$tax = array("James" => "£1.50", "Kevin" => "£3", "Dean" => "£2");

每个阵列都有每个员工的工资/培训/税收。我试图做的是将它们分开,以便我可以为每个员工提供一个数组。期望的结果将采用以下格式employee => (wages, training, tax)

$array1 = array("Tom" => "£20", "£2", "0");
$array2 = array("Mike" => "£5.60", "0", "0");
$array3 = array("James" => "£12", "£7", "£1.50");

我这样做的原因是因为我想通过 CSV 将结果写入电子表格 (fputcsv)。现在,我一直在尝试像这样重组:

首先梳理数组,使其键和值相同。

$combined = array_combine($employeesList, $employeesList);

employeesList仅包含员工的姓名作为值。

然后遍历这个 employee 数组,看看上面定义的数组中是否存在任何键,如下所示:

foreach ($employeesList as $employee) {
if (array_key_exists($employee, $wages))
$combined[$employee] = array($employee, $wages[$employee]);
}
}

这部分工作正常。然后我像这样为税收数组执行此操作:

foreach ($tax as $key => $value) {
if (array_key_exists($key, $combined)) {
array_push($combined[$key], $value);
}

但这在第二次迭代中失败,说array_push在给定字符串时期待一个数组。如上面的数组所示,并非每个员工都会为每个字段提供记录。所以我想知道如何解决这个问题?和/或是否有我正在采取的替代路线。任何帮助不胜感激

首先提取所有名称

$names = array_unique(array_merge(array_keys($wages), array_keys($training), array_keys($tax)));

然后循环访问名称以生成记录集

$employeeList = [];
foreach ($names AS $name)
$employeeList[$name] = [@$wages[$name] ?: 0, @$training[$name] ?: 0, @$tax[$name] ?: 0];

请注意错误抑制与@...这样做是因为我们不在乎缺少单个值;提供默认值。

这将导致如下所示的集合

> var_dump($employeeList);
array(5) {
["Tom"]=>
array(3) {
[0]=>
string(4) "£20"
[1]=>
string(3) "£2"
[2]=>
int(0)
}
["Mike"]=>
array(3) {
[0]=>
string(6) "£5.60"
[1]=>
int(0)
[2]=>
int(0)
}
["James"]=>
array(3) {
[0]=>
string(2) "12"
[1]=>
string(1) "7"
[2]=>
string(6) "£1.50"
}
["Kevin"]=>
array(3) {
[0]=>
int(0)
[1]=>
int(0)
[2]=>
string(3) "£3"
}
["Dean"]=>
array(3) {
[0]=>
int(0)
[1]=>
string(6) "£3.50"
[2]=>
string(3) "£2"
}
}

最新更新