我要計算表格最下方的小計,$list是從資料庫撈出來的所有資料
YaLinqo套件是用php模仿c#的Linq套件中,效能相對比較好的套件,不過該套件無法直接用在資料庫上~
想詢問各位大大們,如果計算小計的方式希望透過一個from($list)->select(...)解決的話,語法要如何呈現?
這是我目前正在使用的code
require_once 'libraries/YaLinqo/Linq.php';
// ...(略)...
while ($row = mysqli_fetch_array($rst, MYSQLI_ASSOC)) {
$list[] = $row;
}
$totalRow = [
'ps_year'=>'小計:'
,'ttlmoneysum' => from($list)->sum('$v["ttlmoneysum"]')
,'rst_moneysum' => from($list)->sum('$v["rst_moneysum"]')
,'stunosum' => from($list)->sum('$v["stunosum"]')
,'rst_stunosum' => from($list)->sum('$v["rst_stunosum"]')
,'licensenosum' => from($list)->sum('$v["licensenosum"]')
,'nomoneylicnosum' => from($list)->sum('$v["nomoneylicnosum"]')
,'cnt' => from($list)->sum('$v["cnt"]')
];
$list[] = $totalRow;
// ...(略)...
在計算小計的部分嘗試用select來一次處理,看能不能改善效能,但會出現找不到sum()的錯誤...
// 這段做法會出現 Call to undefined function sum() 錯誤,明明上方做法sum沒問題啊@@
$totalRow = from($list)->select('[
"ps_year"=>"小計:"
,"ttlmoneysum"=>sum($v["ttlmoneysum"])
,"rst_moneysum"=>sum($v["rst_moneysum"])
,"stunosum"=>sum($v["stunosum"])
,"rst_stunosum"=>sum($v["rst_stunosum"])
,"licensenosum"=>sum($v["licensenosum"])
,"nomoneylicnosum"=>sum($v["nomoneylicnosum"])
,"cnt"=>sum($v["cnt"])
]')->toArrayDeep();
目前看起來好像沒辦法一個select就處理掉,有幾個替代的思路可以參考
1.額外加入一個假欄位對他做group處理後再selectMany回來了
2.使用 MySQL GROUP ROLLUP 自動處裡小計問題
以前有寫一篇MySQL GROUP BY ROLLUP 的應用
https://ithelp.ithome.com.tw/articles/10136825
你參考看看.
沒用過這個
不過官方教學寫得很清楚
我實測過也沒問題
<?php
require_once './vendor/autoload.php';
use \YaLinqo\Enumerable;
$products = array(
array('name' => 'Keyboard', 'catId' => 'hw', 'quantity' => 10, 'id' => 1),
array('name' => 'Mouse', 'catId' => 'hw', 'quantity' => 20, 'id' => 2),
array('name' => 'Monitor', 'catId' => 'hw', 'quantity' => 0, 'id' => 3),
array('name' => 'Joystick', 'catId' => 'hw', 'quantity' => 15, 'id' => 4),
array('name' => 'CPU', 'catId' => 'hw', 'quantity' => 15, 'id' => 5),
array('name' => 'Motherboard', 'catId' => 'hw', 'quantity' => 11, 'id' => 6),
array('name' => 'Windows', 'catId' => 'os', 'quantity' => 666, 'id' => 7),
array('name' => 'Linux', 'catId' => 'os', 'quantity' => 666, 'id' => 8),
array('name' => 'Mac', 'catId' => 'os', 'quantity' => 666, 'id' => 9),
);
$categories = array(
array('name' => 'Hardware', 'id' => 'hw'),
array('name' => 'Operating systems', 'id' => 'os'),
);
$result = from($products)->sum(function($v) {
return $v['quantity'];
});
print_r($result);
result
2069
你是只有 sum 無法使用嗎
還是全部的 function 都是這樣呢
您這個做法是可行的,不過不知道能不能一次處理各欄位加總,所以嘗試透過在select內一次處理就出錯了...不知道是語法哪邊下錯還是不支援這樣的作法~
在select內sum會找不到,min/max會出現僅限陣列的錯誤,猜測是我語法錯誤,但不知道正確是怎麼寫...
你看到的那個 min/max
應該是原生 php 的 function
不是 YaLinqo 的
而且 select 回傳的結果應該跟你想要的不同
e.g.
$result = from($products)
->select(function($v, $k) {
return $v['quantity'];
})
->toArrayDeep();
print_r($result);
上面 code 拿到的結果會是
Array
(
[0] => 10
[1] => 20
[2] => 0
[3] => 15
[4] => 15
[5] => 11
[6] => 666
[7] => 666
[8] => 666
)
恩...那可能只能額外加入一個假欄位對他做group處理後再selectMany回來了~~