Как использовать вложенный цикл в этом примере? - PullRequest
0 голосов
/ 16 октября 2019

Рассмотрим следующий массив $data:

Array
(
    [0] => Array
        (
            [code] => 20
            [name] => Name 1
            [month] => 4
            [cost] => 100
            ..
            ..
        )

    [1] => Array
        (
            [code] => 30
            [name] => Name 2
            [month] => 3
            [cost] => 120
            ..
            ..
        ) 

    [1] => Array
        (
            [code] => 30
            [name] => Name 2
            [month] => 6
            [cost] => 180
            ..
            ..
        )    

    ..
    ..
)

Каждый массив может иметь неизвестное количество кодов. Каждый код имеет свой идентификатор месяца. Я хочу отсортировать и отобразить данные так, чтобы для каждого кода была только одна строка, а затем в этой строке отобразить значение [cost] в столбце с номером, равным месяцу. Например:

Column      1     2     3     4     5     6     7     8     9     10     11    12
Name 1                       100
Name 2                  120               180

Вот что я пытаюсь:

Чтобы узнать, сколько строк должно быть напечатано, я выбираю уникальные значения кода:

$codes = array();                   
foreach( $data as $row ){ 
    if ( in_array($row['code'], $codes) ) {
        continue;
    }
    $codes[] = $row['code'];
}

Далее я использую цикл для печати строк:

foreach( $codes as $code ){

    //print 12 columns for each othe row
    for ($i = 1; $<=12; $i++) {

        //display column value if the code is same as the row
        //and the month value is same as $i
        //here's the problem
        if (( $data['code'] == $code ) &&( $data['month'] == $i )) {
            echo $data['cost'];
        }

    }
}

Проблема / Вопрос: Нужно ли поместить еще один цикл внутри цикла forпроверить, если $data['code'] == $code? Или как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 16 октября 2019

Я бы использовал один цикл для переиндексации массива:

$list = $codes = [];
for ($array as $item){
    $list[$item['code']][$item['month']] = $item;
    $codes[$item['code']] = $item['name'];
}

, затем использовал бы два цикла для печати:

for ($codes as $code => $codeName){
    echo '<tr><th>', $codeName, '</th>';
    for (range(1, 12) as $month){
        echo '<td>', ($list[$code][$month]['cost'] ?? ''), '</td>;
    }
    echo '</tr>', "\n";
}

Мне действительно не нравится идея if (внутри петель.

1 голос
/ 16 октября 2019

Я бы посоветовал вам предварительно обработать данные в структурированный массив, а затем распечатать их, например, проиндексировать с помощью кода со структурой, такой как:

[
  ['the code'] => [
     'name' => '',
     'months' => [ 
        '6' => // cost
     ]
  ]
]

Вы можете сделать это следующим образом:

$items = [
    [
        'code' => 20,
        'name' => 'Name 1',
        'month' => 4,
        'cost' => 100,
    ],
    [
        'code' => 30,
        'name' => 'Name 2',
        'month' => 3,
        'cost' => 120,
    ],
    [
        'code' => 30,
        'name' => 'Name 2',
        'month' => 6,
        'cost' => 180,
    ],
];

$sortedItems = [];
foreach ($items as $item) {
    if (!isset($sortedItems[$item['code']])) {
        $sortedItems[$item['code']] = [
            'name' => $item['name'],
            'months' => [],
        ];
    }

    $sortedItems[$item['code']]['months'][$item['month']] = $item['cost'];
}

Вы можете распечатать его, используя функцию, подобную этой:

function printItemsOf(array $list) {
    echo '<table>';

    // print header
    echo '<tr>';
    echo '<td>Column</td>';
    for ($i = 1; $i <= 12; $i++) {
        echo '<td>' . $i . '</td>';
    }
    echo '</tr>';

    // print items
    foreach ($list as $code => $item) {
        echo '<tr>';
        echo '<td>' . $item['name'] . '</td>';

        for ($i = 1; $i <= 12; $i++) {
            if (!isset($item['months'][$i])) {
                echo '<td></td>';
            } else {
                echo '<td>' . $item['months'][$i] . '</td>';
            }
        }

        echo '</tr>';
    }

    echo '</table>';
}

Который выводит:

<table border="1"><tr><td>Column</td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td><td>9</td><td>10</td><td>11</td><td>12</td></tr><tr><td>Name 1</td><td></td><td></td><td></td><td>100</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>Name 2</td><td></td><td></td><td>120</td><td></td><td></td><td>180</td><td></td><td></td><td></td><td></td><td></td><td></td></tr></table>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...