2013-04-22 27 views
9

Tôi có điều này:giá trị Sum của mảng đa chiều bằng phím mà không cần vòng lặp

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) 
) 

Những gì tôi cần là:. 7", đó là tổng của các cột f_count

Tôi đã cố gắng Tôi nghĩ rằng array_sum() sẽ hoạt động, nhưng không phải với một mảng đa chiều.Vì vậy, tôi đã cố gắng tìm ra cách tách biệt các f_count s bởi unset() hoặc nối hoặc bất kỳ thứ gì khác, nhưng mọi giải pháp dường như liên quan đến một vòng lặp foreach. Tôi đã nhầm lẫn với array_map, array_walk và những người khác không có kết quả. Tôi đã không tìm thấy một chức năng hoạt động tốt với các mảng đa chiều.

Tôi đang chạy PHP 5.4.

Ai đó có thể vui lòng chỉ cho tôi cách tính tổng cột đó mà không cần vòng lặp foreach không?

Nếu được, giá trị f_count sẽ không bao giờ cao hơn 100 và giá trị uid sẽ luôn lớn hơn 100.


Cách khác, nếu có cách chạy truy vấn của tôi khác nhau sao cho mảng không đa chiều, điều đó rõ ràng sẽ hoạt động tốt.

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

Tôi đang sử dụng PDO.

+0

Bạn không thể làm bất cứ điều gì với một mảng mà không lặp. Tại sao bạn không thích nó? – deceze

Trả lời

39

Bạn cần vài nó với array_map() để chọn cột f_count đầu tiên:

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

Tất nhiên, trong nội bộ, điều này thực hiện một vòng lặp kép; nó chỉ là bạn không nhìn thấy nó bên trong mã. Bạn có thể sử dụng array_reduce() để thoát khỏi một vòng lặp:

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

Tuy nhiên, nếu tốc độ là mối quan tâm duy nhất, foreach vẫn là nhanh nhất:

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

này là nhờ vào "địa phương" của các biến mà bạn đang sử dụng, nghĩa là không có cuộc gọi chức năng nào được sử dụng để tính tổng số tiền cuối cùng.

+0

Tôi không quá tự tin khi nghĩ rằng các tùy chọn này có khả năng hiệu quả hơn việc tìm kiếm? – David

+2

@David Không, chúng kém hiệu quả hơn 'foreach'. –

+0

Tôi đoán tôi đã bị hiểu sai. Cảm ơn bạn đã làm rõ. – David

0

cho các loại vòng lặp tình foreach là lựa chọn tốt nhất có thể nhưng nếu u phải làm điều này cho nhiều lần trên một trang duy nhất sau đó u nên đặt vòng lặp foreach trong một chức năng để mã của bạn vẫn sạch

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

Sửa

Sau khi tìm kiếm rất nhiều tôi thấy rằng array_column chức năng tồn tại trong php 5,5 + để nhận được tất cả các giá trị của cột duy nhất là một mảng.

Đối với người dùng có phiên bản thấp hơn Bạn có thể sử dụng chức năng sau và gọi nó với tổng số mảng nếu bạn muốn tổng tất cả các giá trị.

//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); 
    } 
} 

Nếu bạn muốn để có được tất cả các giá trị của cột đơn sau đó gọi trên chức năng như thế này:

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

Nếu bạn muốn tổng của tất cả các giá trị của cột đơn sau đó sử dụng đoạn mã sau:

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

Trong php 5.5+ bạn chỉ có thể sử dụng array_columnarray_sum như vậy:

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

Đây là giải pháp hiệu suất tốt nhất. – Rodrigo

+1

Chỉ cần cho sự chính xác của sự vật, các đối số của mảng array_column sẽ được hoán đổi. –

+0

cảm ơn người đàn ông, bây giờ tôi có thể ngủ ngon. phiên bản của tôi không phải là tổng, nhưng chỉ để đếm, vì vậy tôi sử dụng hàm này => '$ value = array_count_values ​​(mảng_column ($ arr, 'f_count'));' –

0

Vì bạn đang sử dụng PHP 5.4 với PDO, có thể có nhiều hơn một cách để làm điều đó (có sẵn trong PHP 5.1 trở lên):

  • sử dụng PDO fetchAll() chức năng với PDO::FETCH_COLUMN như fetch_style, và Số cột được lập chỉ mục 0 là fetch_argument.

Theo ví dụ của bạn, nó có thể là:

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

Bây giờ sử dụng array_sum chức năng để tổng hợp các giá trị của mảng:

$fcount_sum = array_sum($array_fcount); 

Bạn cũng có thể tham khảo tài liệu PHP tại http://php.net/manual/en/pdostatement.fetchall.php

Hy vọng điều này sẽ hữu ích và hiệu suất có thể tốt hơn so với lặp! Như đã đề cập trong các câu trả lời khác, trong PHP 5.5 trở đi, bạn có hàm array_column() để nhận được $array_fcount trực tiếp từ một mảng khác.

Các vấn đề liên quan