2016-04-13 3 views
2

Ich habe ein Array wie folgt dargestellt:PHP verändern Array mit gleichem Datum auf Array mit einzigartigem Datum und die Gesamtzählung

array 
(
    [0] => array("date"=>'2016-01-01',"type"=>1), 
    [1] => array("date"=>'2016-01-13',"type"=>1), 
    [2] => array("date"=>'2016-01-03',"type"=>1), 
    [3] => array("date"=>'2016-01-01',"type"=>1) 
    .... 
) 

Ich mochte sie durch eindeutiges Datum und Gesamtmenge sortiert werden nach dem Datum:

array 
(
    [0] => array("date"=>'2016-01-01',"type"=>1,"total"=>2), 
    [1] => array("date"=>'2016-01-03',"type"=>1,"total"=>1), 
    [2] => array("date"=>'2016-01-13',"type"=>1,"total"=>1) 
    .... 
) 

Gibt es PHP in Array-Funktion gebaut kann dies tun? Oder sollte ich meine eigene Funktion erstellen?

+0

Ist diese Array-Werte aus der Datenbank generiert –

+0

Ja, es ist Dynamik –

+0

die SQL-Abfrage –

Antwort

1

Nein, da die Verwendung durch das Datumsfeld sein kann, ist sicherlich keine einzige Funktion, die diese magische Weise der Fall ist, würde dies gelöst werden durch mehrere Funktionen.

Zuerst Sie gruppieren auf dem Array benötigen die date wie Sie Schlüssel, es in einem neuen Container setzen

"date"=>'2016-01-01' // group it by this value 

Also, um dies zu tun, müssen Sie neue Werte zuweisen Verwenden Sie diese als Ihr Index.

Zweitens, um Ihr Array sortierbar zu machen, konvertieren Sie einfach die date Schlüssel, die in Unix-Zeitstempel strtotime verwendet werden. So wird es später leichter, aussortieren.

Also alles in allem würde es so aussehen:

$new_array = array(); 
foreach($array as $v) { 
    $date_key = strtotime($v['date']); // turn into unix time 
    if(!isset($new_array[$date_key])) { // initialization 
     // turn total to zero first 
     $new_array[$date_key] = array_merge($v, array('total' => 0)); 
    } 
    $new_array[$date_key]['total']++; // increment 
} 

Nach Array-Werte versammelt sind, dann würden Sie wollen, dass sie sortiert, mit ksort

ksort($new_array); // sort by date 
$new_array = array_values($new_array); // remove unix time keys 

Sample Output

+0

Danke Mann, ich denke, ich bekomme Ihre Mittel, Sie sind erstaunlich: D –

-2

nur
$array[0]["total"] = 2; 
$array[1]["total"] = 1; 
$array[2]["total"] = 1; 
... 
+0

Uhm ... wie hast du dieses Array? – Machavity

0

Gruppe und COUNT für die gesamten Reihen

$sql = "SELECT *, COUNT(date_field) as total 
FROM table 
GROUP BY date_field"; 
$qry = mysqli_query($con, $sql); 
if (mysqli_num_rows($qry) > 0) 
{ 
while ($res = mysqli_fetch_object($qry)) 
{ 
// Date Array 
} 
} 
+0

Ich kann nicht Änderungen an SQL gemacht ... wie ich schon erwähnte –

+0

gibt es keine Änderung in SQL. Dies ist nur eine Abfrage zum Abrufen von Daten. Wie werden Sie die Daten abzurufen? –

+0

Der Grund, warum ich meine SQL-Abfrage nicht ändern kann, ist die Leistung der Abrufgeschwindigkeit zu garantieren, weil die Tabelle ziemlich groß ist und mit kreuzt andere, ich kann INNER JOIN nicht verwenden und muss sorgfältig Felder auswählen, um zusätzliche Ressourcen zu vermeiden ... –

0

Nur als Referenz:

$arr = [ 
 
    0 => array("date"=>'2016-01-01',"type"=>1), 
 
    1 => array("date"=>'2016-01-13',"type"=>1), 
 
    2 => array("date"=>'2016-01-03',"type"=>1), 
 
    3 => array("date"=>'2016-01-01',"type"=>1) 
 
]; 
 

 
// count 
 
$date_arr = array_column($arr, 'date'); 
 
$times_arr = array_count_values($date_arr); 
 
$date_arr = array_map(function($value){ 
 
\t global $times_arr; 
 
\t $value['total'] = $times_arr[$value['date']]; 
 
\t return $value; 
 
}, $arr); 
 

 
// unique 
 
$date_arr = array_map('unserialize', array_unique(array_map('serialize', $date_arr))); 
 

 
var_dump($date_arr);exit;

Verwandte Themen