2013-04-22 2 views
9

ho questo:valori somma di array multidimensionale con chiave senza anello

Array (
    [0] => Array ([f_count] => 1 [uid] => 105) 
    [1] => Array ([f_count] => 0 [uid] => 106) 
    [2] => Array ([f_count] => 2 [uid] => 107) 
    [3] => Array ([f_count] => 0 [uid] => 108) 
    [4] => Array ([f_count] => 1 [uid] => 109) 
    [5] => Array ([f_count] => 0 [uid] => 110) 
    [6] => Array ([f_count] => 3 [uid] => 111) 
) 

cosa ho bisogno è:. 7", che è la somma della colonna f_count

Ho cercato Ho pensato che l'array_sum() avrebbe funzionato, ma non con un array multidimensionale. Quindi, ho provato a capire come isolare i f_count da unset() o lo splicing o qualsiasi altra cosa, ma ogni soluzione sembra implicare un ciclo foreach.Ho giocato con array_map, array_walk e altri inutilmente. Non ho trovato una funzione che funzioni bene con gli array multidimensionali.

Sto eseguendo PHP 5.4.

Qualcuno può indicarmi come sommare la colonna senza un ciclo foreach?

Se aiuta, i valori f_count sarà mai superiore a 100, ei valori uid saranno sempre maggiore di 100.


alternativa, se c'è un modo per eseguire mia domanda diversamente tale che la matrice non è multidimensionale, che sarebbe ovviamente funzionare pure.

$query = "SELECT f_count, uid FROM users WHERE gid=:gid"; 
... 
$array = $stmt->fetchAll(); 

Sto usando PDO.

+0

Non è possibile fare nulla con un array senza loop. Perché sei così contrario? – deceze

risposta

39

È necessario accoppiarlo con array_map() per selezionare la colonna f_count prima:

array_sum(array_map(function($item) { 
    return $item['f_count']; 
}, $arr)); 

Naturalmente, internamente, questo esegue un doppio anello; è solo che non lo vedi all'interno del codice. Si potrebbe utilizzare array_reduce() per sbarazzarsi di un loop:

array_reduce($arr, function(&$res, $item) { 
    return $res + $item['f_count']; 
}, 0); 

Tuttavia, se la velocità è l'unico interesse, foreach rimane il più veloce:

$sum = 0; 
foreach ($arr as $item) { 
    $sum += $item['f_count']; 
} 

Questo è possibile grazie al "località" delle variabili che stai usando, cioè non ci sono chiamate di funzione usate per calcolare la somma finale.

+0

Non sono troppo presuntuoso pensando che queste opzioni siano probabilmente più efficienti di foreach? – David

+2

@David No, sono entrambi meno efficienti di 'foreach'. –

+0

Immagino di essere stato disinformato. Grazie per il chiarimento. – David

0

per questo tipo di ciclo situazione foreach è la migliore opzione possibile, ma se u hanno a che fare questo per più volte in una singola pagina, allora u dovrebbe mettere ciclo foreach in una funzione, in modo che il codice rimanga pulito

function sum_index($arr, $col_name){ 
    $sum = 0; 
    foreach ($arr as $item) { 
     $sum += $item[$col_name]; 
    } 
    return $sum; 
} 

Modifica

Dopo aver cercato un sacco ho scoperto che array_column funzione esiste in PHP 5.5 + per ottenere tutti i valori di un'unica colonna come un array.

Per utenti con versione inferiore È possibile utilizzare la seguente funzione e chiamarla con somma di serie se si desidera sommare anche tutti i valori.

//to get all values of single column from multidimensional array, this function exist in php 5.5 or greater. 
if(!function_exists("array_column")) 
{ 
    function array_column($array,$column_name) 
    { 
     return array_map(function($element) use($column_name){return $element[$column_name];}, $array); 
    } 
} 

Se si desidera ottenere tutti i valori di singola colonna quindi chiamare sopra funzione come questa:

$newArray = array_column($array,$column_name); 

Se volete somma di tutti i valori della singola colonna quindi utilizzare seguente codice:

$newArraySum = array_sum(array_column($array,$column_name)); 
37

In PHP 5.5 + si può semplicemente usato array_column e array_sum in questo modo:

$value = array_sum(array_column($arr,'f_count')); 
+0

Questa è la migliore soluzione per le prestazioni. – Rodrigo

+1

Solo per la correttezza delle cose, gli argomenti di array_column devono essere scambiati. –

+0

grazie amico, ora posso dormire bene. la mia versione non è somma, ma solo per contare, quindi uso questa funzione => '$ value = array_count_values ​​(array_column ($ arr, 'f_count'));' –

0

Dal momento che si sta utilizzando PHP 5.4 con DOP, ci potrebbe essere un altro modo per farlo (disponibile in PHP 5.1+):

  • utilizzare la funzione DOP fetchAll() con la PDO::FETCH_COLUMN come fetch_style, e la Numero di colonna indicizzato 0 come fetch_argument.

Secondo il vostro esempio, potrebbe essere:

$query = "SELECT f_count, uid FROM users WHERE gid=:gid"; 
... 
$array_fcount = $stmt->fetchAll(PDO::FETCH_COLUMN, 0); 

Ora utilizzare la funzione array_sum per sommare i valori dell'array:

$fcount_sum = array_sum($array_fcount); 

Si potrebbe anche consultare la documentazione di PHP a http://php.net/manual/en/pdostatement.fetchall.php

Spero che questo aiuti e che le prestazioni possano essere migliori del ciclo! Come già accennato in altre risposte, in PHP 5.5 in poi si ha la funzione array_column() per ottenere $array_fcount direttamente da un altro array.