1

I have an array of arrays with two specific key/value pairs. What I am trying to do is to get the top 5 unique cause values decided by qty. Meaning that it would group the cause keys together by unique values, then total up the qty keys for each cause, and return the top 5 causes and the total qty for each cause.

Here is what the print_r(array_values($array)) prints out.

Array ( 
[0] => Array ( [cause] => Other (please comment) [qty] => 0.417 ) 
[1] => Array ( [cause] => Chem Out FC-DryStrAddTow [qty] => 0.430 ) 
[2] => Array ( [cause] => Chem Out FC-DryStrAddTow [qty] => 0.430 ) 
[3] => Array ( [cause] => Chem Out FC-DryStrAddTow [qty] => 0.513 ) 
[4] => Array ( [cause] => Chem Out FC-DryStrAddTow [qty] => 0.513 ) 
[5] => Array ( [cause] => Chem Out FC-DryStrAddTow [qty] => 0.750 ) 
[6] => Array ( [cause] => Chem Out FC-DryStrAddTow [qty] => 0.750 ) 
[7] => Array ( [cause] => Slitter Cut/Saw-Poor Cut [qty] => 0.816 ) 
[8] => Array ( [cause] => Slitter Cut/Saw-Poor Cut [qty] => 0.816 ) 
[9] => Array ( [cause] => Slitter Cut/Saw-Poor Cut [qty] => 0.828 ) 
[10] => Array ( [cause] => Slitter Cut/Saw-Poor Cut [qty] => 0.828 ) 
[11] => Array ( [cause] => Slitter Cut/Saw-Poor Cut [qty] => 0.681 ) 
[12] => Array ( [cause] => Slitter Cut/Saw-Poor Cut [qty] => 0.681 ) 
[13] => Array ( [cause] => No Cause Selected [qty] => 0.918 ) 
[14] => Array ( [cause] => No Cause Selected [qty] => 0.918 ) 
[15] => Array ( [cause] => No Cause Selected [qty] => 0.926 ) 
[16] => Array ( [cause] => No Cause Selected [qty] => 0.937 ) 
[17] => Array ( [cause] => No Cause Selected [qty] => 0.809 ) 
[18] => Array ( [cause] => No Cause Selected [qty] => 0.809 ) 
[19] => Array ( [cause] => Slitter Cut/Saw-Poor Cut [qty] => 0.891 ) 
[20] => Array ( [cause] => Slitter Cut/Saw-Poor Cut [qty] => 0.891 ) 
[21] => Array ( [cause] => Slitter Cut/Saw-Poor Cut [qty] => 0.884 ) 
[22] => Array ( [cause] => Slitter Cut/Saw-Poor Cut [qty] => 0.884 ) ) 

Thank you in advance for your help.

4

2 回答 2

2
<?php

// Total up the quantities
$totals = array();
$tally  = array();
foreach ($datapoints as $entry) {
    if (!isset($totals[$entry['cause']]) {
        $totals[$entry['cause']] = 0;
        $tally[$entry['cause']]  = 0;
    }
    $totals[$entry['cause']] += $entry['qty'];
    $tally[$entry['cause']]++;
}

// Sort them, 'descending' or 'reverse', so the larger entries are first
arsort($totals, SORT_NUMERIC);

// Take the first 5 entries from the sorted list
$top = array_slice($totals, 0, 5);

// Do something with it.
foreach ($top as $cause => $totalQty) {
    echo $cause . ': ' . $totalQty . ' with ' . $tally[$cause] . ' events' . PHP_EOL;
}

但是,如果此数据来自数据库,则最好使用数据库和 SQL,例如:

SELECT cause, SUM(qty) as totalQty, COUNT(qty) as tally
FROM data
GROUP BY cause
ORDER BY totalQty DESC
LIMIT 5;

而是在 php.ini 中加载所有数据和处理。

于 2012-10-30T18:42:44.120 回答
1

如果使用 php 5.3+,您可以在代码中使用闭包并排序(按数量降序)

usort($arary,function($a,$b){
    return $b['qty'] - $a['qty']
}

在此之后,您可以遍历数组并获取前 5 个唯一值。

于 2012-10-30T18:45:05.093 回答