Создать матричный отчет с тремя массивами

У меня есть три массива:

$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

Я бы начал с реорганизации этих данных примерно так: 3v4l.org/AkpFr Это должно быть довольно легко перебрать, чтобы создать желаемую структуру вывода. Если вы хотите, вы можете потом сортировать ключи на первом и втором уровне, чтобы они не располагались по порядку в зависимости от входных данных. Вам нужно будет проверить, установлена ​​ли запись для конкретной компании, иначе выведите -. И если вам нужна эта динамика в отношении компаний, вам также придется собирать все встречающиеся компании, реорганизовывая данные.

CBroe 04.06.2024 08:31

Если я добавлю этот элемент в массив $companyY: [ 5 => 'компания Y', 701 => 'Затраты', 6360 => 'Поставщик K', 'сумма' => 566]. переполнение таблицы: поставщик затрат K — 566,00 долларов США — — — — — 599,00 долларов США

Jorch Cab 06.06.2024 21:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы знаете коды ваших ключей данных, количество компаний, их названия и т. д., вы можете ссылаться на них при циклическом переборе реструктурированного массива. Хотя это, вероятно, не самый красноречивый и динамичный ответ, он выполняет свою работу.

    $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;

Рабочий снипит на PHP Sandbox

Другие вопросы по теме