Два цикла цикла в одном массиве? - PullRequest
0 голосов
/ 08 марта 2019

Я пытаюсь взять номер детали из двух разных таблиц и поместить их в один и тот же массив, а затем переставить их.

Как ни странно, он дает номер детали дважды, но когда я запускаю один и тот же запрос в phpmyadmin, он дает каждый номер детали по одному разу. Я провожу целый день, но не могу это исправить.

//first query

$finalData = array(); $sql="SELECT
    jobc_parts_p.part_no,
    SUM(jobc_parts_p.issued_qty) AS sale_qty  FROM
    `jobc_parts_p`  WHERE DATE_FORMAT(jobc_parts_p.date_time,'%Y-%m-%d') BETWEEN '".$f."' AND '".$t."'

GROUP BY jobc_parts_p.part_no";


$result = $conn->query($sql);
while($row = $result->fetch_assoc()){   
 $finalData[$row['part_no']][] = $row;
}

// второй запрос

  $sql2="SELECT
        jobc_consumble_p.part_no,
        SUM(jobc_consumble_p.issued_qty) AS csale_qty
    FROM
        `jobc_consumble_p`  
     WHERE DATE_FORMAT(jobc_consumble_p.date_time,'%Y-%m-%d') BETWEEN '".$f."' AND '".$t."'
    GROUP BY
    jobc_consumble_p.part_no";

$result = $conn->query($sql);
while($row = $result->fetch_assoc()){   
 $finalData[$row['part_no']][] = $row;
}       

/// реорганизация данных ......

$rearrangedFinalData = array();
foreach($finalData AS $first) {
    foreach($first AS $data) {
        $temp = array();
        $temp['part_no'] = $data['part_no'];
        $temp['sale_qty'] = isset($data['sale_qty']) ? $data['sale_qty'] : $data['csale_qty'];
        $rearrangedFinalData[] = $temp;
    }
}

// выходной результат

foreach($rearrangedFinalData AS $row) {
         $sr++;


            echo "<tr><td>$sr</td>
            <td colspan='2' >",$row["part_no"],"</td>                       
            <td align='center'>",$row["sale_qty"],"</td>
            </tr>";      
     }

РЕЗУЛЬТАТ

1    10R46    2
2    10R46    2
3    10R91    1
4    10R91    1
5    10M95    3
6    10M95    3

Что я хочу:

1    10R46    2
2    10R91    1
3    10M95    3

Первый запрос print_r ($ finalData);

Array ( 
[10R46    ] => Array ( [0] => Array ( [part_no] => 
10R46     [sale_qty] => 1 ) )
[10R91    ] => Array ( [0] => Array ( [part_no] => 
10R91     [sale_qty] => 3 ) )) 

Ответы [ 3 ]

0 голосов
/ 08 марта 2019

Я думаю, что ваша проблема лежит в $ finalData, где вы храните одни и те же результаты дважды. (конечно же из разных таблиц).

первый запрос создает результат

$finalData = array(
'10R46' => array(0 => array('part_no' => 10R46, 'sale_qty' => 2)),
'10R91' => array(0 => array('part_no' => 10R91, 'sale_qty' => 1)),
'10M95' => array(0 => array('part_no' => 10M95, 'sale_qty' => 2))
);

затем вы запускаете второй запрос и снова ДОБАВЛЯЕТЕ к окончательным данным с этим $finalData[$row['part_no']][] = $row;

так что $ finalData теперь что-то вроде

$finalData = array(
'10R46' => array(0 => array('part_no' => 10R46, 'sale_qty' => 2), 1 => array('part_no' => 10R46, 'csale_qty' => 2)),
'10R91' => array(0 => array('part_no' => 10R91, 'sale_qty' => 1), 1 => array('part_no' => 10R91, 'csale_qty' => 1)),
'10M95' => array(0 => array('part_no' => 10M95, 'sale_qty' => 3), 1 => array('part_no' => 10M95, 'csale_qty' => 3))
);

По этой причине вы удваиваете цикл, а также получаете двойной результат.

Так что я бы объединил запросы.

$sql="SELECT
jobc_parts_p.part_no,
SUM(jobc_parts_p.issued_qty) AS sale_qty,
SUM(jobc_consumble_p.issued_qty) AS csale_qty ## this part was added
FROM `jobc_parts_p`
LEFT JOIN `jobc_consumable_p` ON (jobc_consumable_p.part_no = jobc_parts_p.part_no) ## this part was added
WHERE DATE_FORMAT(jobc_parts_p.date_time,'%Y-%m-%d') BETWEEN '".$f."' AND '".$t."'
GROUP BY jobc_parts_p.part_no";

и теперь ваш результат должен выглядеть примерно так без второго запроса

$finalData = array(
'10R46' => array(0 => array('part_no' => 10R46, 'sale_qty' => 2, 'csale_qty' => 2)),
'10R91' => array(0 => array('part_no' => 10R91, 'sale_qty' => 1, 'csale_qty' => 1)),
'10M95' => array(0 => array('part_no' => 10M95, 'sale_qty' => 2, 'csale_qty' => 3))
);

также, если вы не ожидаете, что будет две строки с одинаковым part_no, вы можете изменить

$finalData[$row['part_no']][] = $row; -> $finalData[$row['part_no']] = $row;

Так что вам не нужно делать двойной цикл.

0 голосов
/ 08 марта 2019
$new_array = array_values(array_unique($rearrangedFinalData));

Удалите дубликаты и переставьте ключи (при необходимости) перед тем, как поместить массив в foreach.

Затем вы можете использовать $new_array для генерации вашего HTML

0 голосов
/ 08 марта 2019

Потому что вы дважды зацикливаетесь:

Изменение

$rearrangedFinalData = array();
foreach($finalData AS $first) {
    foreach($first AS $data) { // <-- Remove this extra loop.
        $temp = array();
        $temp['part_no'] = $data['part_no'];
        $temp['sale_qty'] = isset($data['sale_qty']) ? $data['sale_qty'] : $data['csale_qty'];
        $rearrangedFinalData[] = $temp;
    }
}

Кому:

$rearrangedFinalData = array();
foreach($finalData AS $first) {
        $temp = array();
        $temp['part_no'] = $first['part_no'];
        $temp['sale_qty'] = isset($first['sale_qty']) ? $first['sale_qty'] : $data['csale_qty'];
        $rearrangedFinalData[] = $temp;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...