У меня есть три массива:
$companyX = [
0 => [ 2 => 'company X', 107 => 'Accounts receivable', 2000 => 'Provider A', 'amount' => 2 ],
1 => [ 2 => 'company X', 107 => 'Accounts receivable', 4123 => 'Provider F', 'amount' => 5 ],
2 => [ 2 => 'company X', 205 => 'Accounts payable', 2000 => 'Provider A', 'amount' => 2 ],
3 => [ 2 => 'company X', 205 => 'Accounts payable', 4123 => 'Provider F', 'amount' => 7 ],
4 => [ 2 => 'company X', 603 => 'Sales', 2011 => 'Provider G', 'amount' => 9 ]
];
$companyY = [
0 => [ 5 => 'company Y', 107 => 'Accounts receivable', 2000 => 'Provider A', 'amount' => 15 ],
1 => [ 5 => 'company Y', 107 => 'Accounts receivable', 4123 => 'Provider F', 'amount' => 21 ],
2 => [ 5 => 'company Y', 205 => 'Accounts payable', 2000 => 'Provider A', 'amount' => 36 ],
3 => [ 5 => 'company Y', 205 => 'Accounts payable', 4123 => 'Provider F', 'amount' => 47 ],
4 => [ 5 => 'company Y', 701 => 'Costs', 6360 => 'Provider K', 'amount' => 14 ]
];
$companyZ = [
0 => [ 8 => 'company Z', 107 => 'Accounts receivable', 2000 => 'Provider A', 'amount' => 51 ],
1 => [ 8 => 'company Z', 107 => 'Accounts receivable', 4123 => 'Provider F', 'amount' => 63 ],
2 => [ 8 => 'company Z', 205 => 'Accounts payable', 2000 => 'Provider A', 'amount' => 74 ],
3 => [ 8 => 'company Z', 205 => 'Accounts payable', 4123 => 'Provider F', 'amount' => 83 ]
];
Надеюсь получить следующий отчет:

Я попробовал следующее, но это не то, что я ожидал:
$group = [...$companyX, ...$companY, ...$companyZ ];
?>
<table class = "table">
<tr>
<td>Company</td>
<td>Account</td>
<td>Provider</td>
<td>Amount</td>
</tr>
<?php foreach ($group as $key => $detail) : ?>
<tr>
<?php foreach ($detail as $dt) : ?>
<td><?php echo $dt; ?></td>
<?php endforeach; ?>
</tr>
<?php endforeach; ?>
</table>
Company Account Provider Amount
company X Accounts receivable Provider A 2
company X Accounts receivable Provider F 5
company X Accounts payable Provider A 2
company X Accounts payable Provider F 7
company X Sales Provider G 9
company Y Accounts receivable Provider A 15
company Y Accounts receivable Provider F 21
company Y Accounts payable Provider A 36
company Y Accounts payable Provider F 47
company Y Costs Provider K 14
company Z Accounts receivable Provider A 51
company Z Accounts receivable Provider F 63
company Z Accounts payable Provider A 74
company Z Accounts payable Provider F 83
Если я добавлю этот элемент в массив $companyY: [ 5 => 'компания Y', 701 => 'Затраты', 6360 => 'Поставщик K', 'сумма' => 566]. переполнение таблицы: поставщик затрат K — 566,00 долларов США — — — — — 599,00 долларов США






Если вы знаете коды ваших ключей данных, количество компаний, их названия и т. д., вы можете ссылаться на них при циклическом переборе реструктурированного массива. Хотя это, вероятно, не самый красноречивый и динамичный ответ, он выполняет свою работу.
$companies = [...$companyX, ...$companyY, ...$companyZ];
$data = ['Accounts payable', 'Accounts receivable', 'Costs', 'Sales'];
function returnPayable($data, $companies) {
$compKeys = [2,5,8];
$providerKeys = [2000, 2011, 4123, 6360];
$payable = [];
$company = '-';
foreach($companies as $arr){
foreach($data as $v2){
if (in_array($v2, $arr)) {
foreach($arr as $k => $v) {
if (in_array($k, $compKeys)) {
$company = $v;
}
if (in_array($k, $providerKeys)) {
$payable[$v2][$v][] = [$company => $arr['amount']];
}
}
}
}
}
return $payable;
}
Это вернет вложенный массив со столбцом «Учетная запись» в качестве родительского ключа с данными поставщика и компании в виде вложенных массивов.
Затем вы можете перебирать новый массив и использовать вспомогательные массивы для сравнения данных и вывода их в таблицу.
// save the array call to a variable
$list = returnPayable($data, $companies);
// output variable to build table
$output = "
<table>
<tr>
<th>Account</th>
<th>Provider</th>
<th>Company X</th>
<th>Company Y</th>
<th>Company Z</th>
</tr>";
// iterate over the array
foreach($list as $account => $row){
$output .= '<tr>';
// get the account and provider
foreach($row as $provider => $company){
$output .= "<td>$account</td>";
$output .= "<td>$provider</td>";
// check the count of the companies is less than three
// company X, Y and Z = 3
foreach($company as $val){
// conditional to get the name and amount
if (count($company) < 3) {
// probably a better way to do this dynamically
foreach($v3 as $k3 => $v4){
$k3 === 'company X' ? $output .= "<td>usd".number_format($v4, 2, '.', '')."</td>" : $output .= "<td> - </td>";
$k3 === 'company Y' ? $output .= "<td>usd".number_format($v4, 2, '.', '')."</td>" : $output .= "<td> - </td>";
$k3 === 'company Z' ? $output .= "<td>usd".number_format($v4, 2, '.', '')."</td>" : $output .= "<td> - </td>";
}
}else{
foreach($v3 as $k3 => $v4){
$output .= "<td>usd".number_format($v4, 2, '.', '')."</td>";
}
}
}
$output .= "</tr>";
}
}
$output .= "</table>";
return $output;
Я бы начал с реорганизации этих данных примерно так: 3v4l.org/AkpFr Это должно быть довольно легко перебрать, чтобы создать желаемую структуру вывода. Если вы хотите, вы можете потом сортировать ключи на первом и втором уровне, чтобы они не располагались по порядку в зависимости от входных данных. Вам нужно будет проверить, установлена ли запись для конкретной компании, иначе выведите
-. И если вам нужна эта динамика в отношении компаний, вам также придется собирать все встречающиеся компании, реорганизовывая данные.