2015-07-30 2 views
0

У меня есть массив в PHP этого типа, полученный в результате конкретного запроса на db.PHP - условная сумма некоторых значений массива

$output = Array 
(
    [0] => Array 
     (
     'price' => 100 
     'date' => '2015-07-28' 
     'total' => 200 
     'qty' => 2 
    ) 
    [1] => Array 
     (
     'price' => 80 
     'date' => '2015-07-28' 
     'total' => 240 
     'qty' => 3 
    ) 
    [2] => Array 
     (
     'price' => 100 
     'date' => '2015-07-29' 
     'total' => 300 
     'qty' => 3 
    ) 
    [3] => Array 
     (
     'price' => 90 
     'date' => '2015-07-28' 
     'total' => 90 
     'qty' => 1 
    ) 
) 

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

$grouped = Array 
(
[0] => Array 
    (
    [price] => 100 
    [sumtotal] => 500 
    [sumqty] => 5 
    ) 
[1] => Array 
    (
    [price] => 80 
    [sumtotal] => 240 
    [sumqty] => 3 
    ) 
[2] => Array 
    (
    [price] => 90 
    [sumtotal] => 90 
    [sumqty] => 1 
    ) 
) 

До сих пор не может найти способ, чтобы обойти это.

+2

Потенциальный дубликат http://stackoverflow.com/questions/12838729/multidimensional-array-array-sum –

ответ

0

Я не понимаю, это тот же массив без даты ..?

Edit:

Ok попробовать это

$temp= array(); 
for($i=0; $i<sizeof($outpout);$i++) 
{ 

if(!isset($temp[$i])) 
    $temp[$i]=array(); 
$temp[$i][$outpout[$i]['price']]+=$outpout[$i]['qty']]; 
} 

$res=array(); 
$count=0; 
foreach($temp as $key => $value) 
{ 
    $res[$count]['price']=$key; 
    $res[$count]['qty']=$value; 
    $res[$count]['total']=$key*$value; 
    $count++; 
} 
+0

№ Как вы можете видеть, у меня есть два элемента с ценой = 100, поэтому я просто суммирую qty и total для этих двух элементов. – AntR

+0

, конечно, есть лучший способ, но он работает для меня – Alexis

2

Попробуйте использовать простой foreach цикл, как

$result = array(); 
foreach ($output as $key => $value) { 
    $hash = $value['price']; 
    if (isset($result[$hash])) { 
     $result[$hash]['price'] = $value['price']; 
     $result[$hash]['sumtotal'] += $value['total']; 
     $result[$hash]['sumqty'] += $value['qty']; 
    } else { 
     $result[$hash]['price'] = $value['price']; 
     $result[$hash]['sumtotal'] = $value['total']; 
     $result[$hash]['sumqty'] = $value['qty']; 
    } 
} 
print_r(array_values($result)); 

Demo

+1

Это лучший способ: D – Alexis

+0

Спасибо @Alexis ... –

+0

Обратите внимание, что выход этого частично исправлен, потому что выходные массивы будут 100,80, 90 и не 0,1,2 – VMcreator

0

Хорошо, вот простой полный код s ольве свою проблему.

$output=array();//this is your array 
$price_index=array(); 
$final_array=array(); 
foreach($output as $key=>$value) 
{ 
    //first check if price is already in $price_index 
    if(!isset($price_index[$value["price"]])) 
    { 
     $price_index[$value["price"]]=sizeof($price_index); 
    } 
    $final_index=$price_index[$value["price"]]; 
    if(isset($final_array[$final_index])) 
    { 
     $final_array[$final_index]["total"]+=$value["total"]; 
     $final_array[$final_index]["qty"]+=$value["qty"]; 
    } 
    else 
    { 
     $final_array[$final_index]["total"]=$value["total"]; 
     $final_array[$final_index]["qty"]=$value["qty"]; 
     $final_array[$final_index]["price"]=$value["price"]; 
    } 
} 
//display our final array 
print_r($final_array); 

Что я сделал:

  • итерация через ваш массив
  • проверки, если текущая цена была добавлена ​​$ final_array ранее, путем создания массива $ price_index, который содержит цену как ключ и значение это индекс массива $ output в первый раз, когда цена произошла.
  • теперь, если цена повторяется снова, цена $ price_index [текущая цена] будет обнаружена, что она уже была установлена ​​ранее, тогда мы будем использовать это значение как индекс нашего $ final_array и добавим текущее общее количество и количество к существующему ,
  • затем отобразить массив (необязательно).

Надеюсь, что это поможет. Пожалуйста, не просто скопируйте мой код, проанализируйте и поймите его. :)

+0

Вывод точно аналогичен второму массиву в вопросе. – VMcreator