Отображение массивов в один массив php - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь найти лучший способ сопоставить набор массивов в один массив.

$name = ['Toyota','Toyota','Lexus'];
$invoiceCount= [1,1,2];
$netSales =  [28,25,520];
$gp = [6,6,103];
$gpp = [0.2143,0.24,0.1981]
$returnRate = [0,0,0];
$returnRateP = [0,0,0];
$lastOrder = ['2020-06-16','2020-06-16','2020-06-12'];

Я хочу сопоставить один массив на основе массива $ name.

Это то, что у меня есть

$results = array();

for($i = 0; $i < count($name); $i++) {
    $results[$oem[$i]] = array(
        "IC"  => ($results[$name[$i]]['IC'] ?: 0) + $invoiceCount[$i],
        "NS"  => ($results[$name[$i]]['NS'] ?: 0) + $netSales[$i],
        "GP"  => ($results[$name[$i]]['GP'] ?: 0) + $gp[$i],
        "GPP" => ($results[$name[$i]]['GPP'] ?: 0) + $gpp[$i],
        "ReR" => ($results[$name[$i]]['ReR'] ?: 0) + $returnRate[$i],
        "RR"  => ($results[$name[$i]]['RR'] ?: 0) + $returnRateP[$i],
        "OM"  => ($results[$name[$i]] = $oem[$i]),
        "LO"  => ($results[ $oem[$i] ]['LO']  ?:0 ) + $lastOrder[$i],
    );
    //var_dump($results); die();
}

Кажется, все отображается нормально, однако $ lastOrder - это тот, с которым мне, кажется, трудно. $ lastOrder по какой-то причине отображает заказы и добавляет их. Когда я var_dump $ results это то, что я получаю для "LO"

["Toyota"]=>["LO"]=>int(4040)
["Lexus"]=>["LO"]=>int(2020)

Результаты, которые я хочу, это

["Toyota"]=>["LO"]=>['2020-06-16','2020-06-16']
["Lexus"]=>["LO"]=>['2020-06-12']

любые идеи?

1 Ответ

0 голосов
/ 19 июня 2020

Глядя на LO, кажется, что вы хотите собрать все даты, которые сопоставляются с ключом имени, поэтому вам нужно сделать array_merge и избегать +, поскольку это даты и объединение + на массивы полностью отличаются от того, что вам нужно. Фрагмент будет выглядеть так:

"LO"  => array_merge(($results[ $oem[$i] ]['LO']  ? $results[ $oem[$i] ]['LO'] : [] ) , [ $lastOrder[$i] ] )

Для PHP 5.3 или ниже вам нужно будет использовать синтаксис array() вместо [], как показано ниже:

"LO"  => array_merge(($results[ $oem[$i] ]['LO']  ? $results[ $oem[$i] ]['LO'] : array() ) , array( $lastOrder[$i] ) )

Обновление:

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

$results = array();
 for($i = 0; $i < count($oem); $i++) {
          $results[$oem[$i]] = array(
           "IC"  => (isset($results[ $oem[$i] ]['IC'])  ?: 0) + $invoiceCount[$i],
           "NS"  => (isset($results[$oem[$i]]['NS']) ?: 0) + $netSales[$i],
           "GP"  => (isset($results[$oem[$i]]['GP']) ?: 0) + $gp[$i],
           "GPP" => (isset($results[$oem[$i]]['GPP']) ?: 0) + $gpp[$i],
           "ReR" => (isset($results[$oem[$i]]['ReR']) ?: 0) + $returnRate[$i],
           "RR"  => (isset($results[$oem[$i]]['RR']) ?: 0) + $returnRateP[$i],
           "OM"  =>  $oem[$i],
           "LO"  => array_merge((isset($results[ $oem[$i] ]['LO'])  ? $results[ $oem[$i] ]['LO'] : array() ) , array( $lastOrder[$i] ) )
       );
                        //var_dump($results); die();
  }

print_r($results);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...