2016-12-21 2 views
1

У меня есть запрос, который я исполняю, то я используюКак я могу реорганизовать этого ужасного зверя?

while($row = $result->fetch_assoc()){ 
     $data[] = $row; 

Я знаю, что это гротеск, но я не уверен в том, как сделать этот объект или многомерный массив, так что я только что сделал что-то вроде этого ..

$NUH2016 = array(); 
$NUH2017 = array(); 
$NUH2018 = array(); 
$NUH2019 = array(); 
$NUH2020 = array(); 
$NUH2021 = array(); 
$RBN2016 = array(); 
$RBN2017 = array(); ... 

...$GDT2019 = array(); 
$GDT2020 = array(); 
$GDT2021 = array(); 

while($row = $result->fetch_assoc()){ 
     $data[] = $row; 
     if($row['Location'] == 'NUH' && $row['Year'] == '2016'){ 
      $NUH2016[] = $row['P_1']; 
      $NUH2016[] = $row['P_2']; 
      $NUH2016[] = $row['P_3']; 
      $NUH2016[] = $row['P_4']; 
     } 
     if($row['Location'] == 'NUH' && $row['Year'] == '2017'){ 
      $NUH2017[] = $row['P_1']; 
      $NUH2017[] = $row['P_2']; 
      $NUH2017[] = $row['P_3']; 
      $NUH2017[] = $row['P_4']; 
     } 
     //...for all locations and years 

...then 
$content = array(); 
$results = array(); 

$NUH2016_total = array_sum($NUH2016); 
$NUH2017_total = array_sum($NUH2017); 
$NUH2018_total = array_sum($NUH2018); 
$NUH2019_total = array_sum($NUH2019); 
$NUH2020_total = array_sum($NUH2020); 
$NUH2021_total = array_sum($NUH2021); 


$results['NUH~2016'] = $NUH2016_total; 
$results['NUH~2017'] = $NUH2017_total; 
$results['NUH~2018'] = $NUH2018_total; 
$results['NUH~2019'] = $NUH2019_total; 
$results['NUH~2020'] = $NUH2020_total; 
$results['NUH~2021'] = $NUH2021_total; 

$RBN2016_total = array_sum($RBN2016); 
$RBN2017_total = array_sum($RBN2017); 
$RBN2018_total = array_sum($RBN2018); 
$RBN2019_total = array_sum($RBN2019); 
$RBN2020_total = array_sum($RBN2020); 
$RBN2021_total = array_sum($RBN2021); 


$results['RBN~2016'] = $RBN2016_total; 
$results['RBN~2017'] = $RBN2017_total; 
$results['RBN~2018'] = $RBN2018_total; 
$results['RBN~2019'] = $RBN2019_total; 
$results['RBN~2020'] = $RBN2020_total; 
$results['RBN~2021'] = $RBN2021_total; 
...etc 

$content['Results'] = $results; 
$response = json_encode($content); 
echo $response; 

Так что я хочу сделать объект или ассоциативный массив, который выглядит так.

content { 
     produced hours{ 
         nuh{ 2016:16,000 
          2017:8,000 
          ... 
          } 
         rbn{ 2016:9,000 
          2017:whatever 
          .... 
         } 
      man hours{ 
         nuh{ 2016:4,000 
          2017:2,000 
          ... 
          } 
         rbn{ 2016:1,000 
          2017:more stuff 
          .... 
         } 

но я довольно новичок в php-объектах. Как я могу реорганизовать его так, чтобы мне не приходилось инициализировать каждый пустой массив, есть куча операторов if, чтобы каждая запись из запроса вписывалась в массив, который нужно суммировать, а затем помещать все в объект на конец, чтобы вернуться от функции успеха ajax?

+2

Кто-то исправит меня, если я ошибаюсь, но я верю, что вопросы по рефакторингу лучше подходят для [Обзор кода] (http://codereview.stackexchange.com/) (у вас больше шансов получить хорошие ответы там). – jadhachem

ответ

1

Там нет необходимости объявлять столько массивов. Просто измените while() петлю следующим образом,

$resultArr = array(); 
while($row = $result->fetch_assoc()){ 
    $tmpArr = array($row['P_1'], $row['P_2'], $row['P_3'], $row['P_4']); 
    $sumTotal = array_sum($tmpArr); 
    $tmpArr['sumTotal'] = $sumTotal; 
    $resultArr[$row['Location']][$row['Year']][] = $tmpArr; 
} 

Позже применить json_encode() на результирующем массиве, как это,

$json = json_encode($resultArr); 

Sidenote: Если вы хотите, чтобы увидеть полный массив структура, do var_dump($resultArr);

+0

Это тоже будет очень хорошо! Спасибо за Ваш ответ –

1

У вас может быть массив массивов, поэтому вам не нужно вручную назначать их все.

$LocationAndYears; 
while($row = $result->fetch_assoc()) 
{ 
    $LocationAndYears[$row['Location']] [$row['Year']] [0] = $row['P_1']; 
    $LocationAndYears[$row['Location']] [$row['Year']] [1] = $row['P_2']; 
    $LocationAndYears[$row['Location']] [$row['Year']] [2] = $row['P_3']; 
    $LocationAndYears[$row['Location']] [$row['Year']] [3] = $row['P_4']; 
    $LocationAndYears[$row['Location']] [$row['Year']] ['sum'] = array_sum($LocationAndYears[$row['Location']] [$row['Year']]); 
} 
echo $LocationAndYears['NUH']['2012'][0]; 
echo "Sum for 2012 at NUH:" . $LocationAndYears['NUH']['2012']['sum']; 
print_r($LocationAndYears); 
+0

Извините, я продолжаю редактировать и грабить. –

+0

Удивительный, это то, что я искал. Итак, если у вас есть '$ LocationAndYears ['NUH'] ['2016'] [0]' с индексами 0-3, я бы просто использовал 'array_sum()' on' $ LocationAndYears ['NUH'] ['2016 '] ', чтобы получить общее количество? И я делаю это для каждого года и для каждого места? –

+0

@LoganVoss посмотреть мои правки –

0

Не записывая все это, посмотрите на многомерные массивы. Что-то вроде этого, может быть ... Но на самом деле я думаю, что ответ на это указать вам на многомерные массивы, как это очень расплывчатое

$data = array(); 
while($row = $result->fetch_assoc()){ 
    $location = $row['Location']; 
    $year  = $row['Year']; 

    $data[$location] = $data[$location] ? $data[$location] : array(); 
    $data[$location][$year] = $data[$location][$year] ? $data[$location][$year] : array(); 

    $data[$location][$year][] = $row['P_1']; 
    $data[$location][$year][] = $row['P_2']; 
    $data[$location][$year][] = $row['P_3']; 
    $data[$location][$year][] = $row['P_4']; 
} 
Смежные вопросы