Php 如何使用多维数组实现excel的小计功能?
我想知道如何在多维数组中求下一个和 我有这个阵列:Php 如何使用多维数组实现excel的小计功能?,php,arrays,arraylist,multidimensional-array,web-applications,Php,Arrays,Arraylist,Multidimensional Array,Web Applications,我想知道如何在多维数组中求下一个和 我有这个阵列: $products = array ( array("Id" => "000001", "Name" => "Cheese", "Quantity" => "10", "Price" => "10"),
$products = array (
array("Id" => "000001",
"Name" => "Cheese",
"Quantity" => "10",
"Price" => "10"),
array("Id" => "000001",
"Name" => "Cheese",
"Quantity" => "20",
"Price" => "20"),
array("Id" => "000001",
"Name" => "Cheese",
"Quantity" => "10",
"Price" => "30"),
array("Id" => "000002",
"Name" => "Ham",
"Quantity" => "20",
"Price" => "200"),
array("Id" => "000002",
"Name" => "Ham",
"Quantity" => "9",
"Price" => "100"),
array("Id" => "000003",
"Name" => "Baicon",
"Quantity" => "40",
"Price" => "900")
);
我有一个接收三个参数的函数,它们是:数组乘积、一个名为cond1的变量和另一个名为cond2的变量
cond1和cond2是数组的两个键名(例如=cond1:“Id”和cond2:“Price”),我想要下一个:
function SumArray ($product = null, $cond1 = null, $cond2 = nul)
{
$subArray = array(); //array que se utilizara para particionar el array1, obtener 1 fila y comprobar si los nombres de las llaves que se introducen como parametros existen verdaderamente en el arreglo.
$new_Array = array(); //array que sera retornado por esta función
//validations
if (!is_array($product) || empty($product)) {
return "Exist an error with array";
} else
{
$subArray = $product[0];
if (empty($cond1)) {
return "parameter 2 is empty";
} else if (empty($cond2)) {
return "parameter 3 is empty";
} else {
if (array_key_exists($cond1, $subArray) && array_key_exists($cond2, $subArray)) {
//foreach to sum values
foreach($product as $item){
if(array_key_exists($item[$cond2],$new_Array)){
$new_Array[$item[$cond1]][$cond2] = $new_Array[$item[$cond1]][$cond2] + $item[$cond2];
} else {
//if key no exist, add it
$new_Array[$item[$cond1]] = array($cond2=>$item[$cond2]);
}
}
} else {
return "Keys doesn't exist in array";
}
}
}
//new array
return $new_Array;
}
$b = "Id";
$c = "Quantity";
$resul = array();
$resul = SumArray($a, $b, $c);
echo "<br><br>";
print_r($resul);
echo "<br><br>";
这不是预期的结果。我哪里会错呢
reul数组应该包含如下内容:
array([Id] => "000001", [Quantity] => "60",
我不知道您为什么不在DB级别执行此操作,但基本上您需要做的(或其中一种方法)只是将数组分组,并使用
Id
对特定列进行相应的求和
使用键将其分组,如下所示:
$array[<id here>][<desired column here>]
旁注:正如我在评论中所说的,假设您使用的是MySQL,那么您可以在该级别上进行操作,而不是在PHP中进行求和。大概是这样的:
SELECT p.name, SUM(p.quantity) FROM products p
GROUP BY p.product_id
那你就不需要再用PHP了。您只需获取值,不必担心添加值。鉴于上述数组,您可以执行以下操作:
Array
(
[Cheese] => 60
[Ham] => 300
[Baicon] => 900
)
$subtotals=函数($arr、$lookupCol、$sumCol){
$map=[];
foreach($arr作为$index=>$elem){
if(isset($elem[$lookupCol])&&isset($elem[$sumCol])){
$map[$elem[$lookupCol]]=isset($map[$elem[$lookupCol]])?
$map[$elem[$lookupCol]]+$elem[$sumCol]:
$elem[$sumCol];
}
}
返回$map;
};
使用以下命令调用函数:
print_r($subtotals($products, "Name", "Price"));
将返回以下内容:
Array
(
[Cheese] => 60
[Ham] => 300
[Baicon] => 900
)
阵列从哪里来?以分贝为单位?也许,与其在PHP级别上执行,不如在数据库级别上执行,在那里求和,这样在PHP中,您就不必再在这里执行任何操作,只需获取值即可。数组来自csv文件。它工作得非常好,谢谢。你们在数据库中做这个操作是完全正确的,这是我将接受cosider的一个建议。在这种情况下,为了我的项目,我需要做这个功能。但是我会认真考虑你的建议,它们非常有价值。例如,有没有可能代替数组([000001]=>Array([Id]=>000001[Quantity]=>40),打印如下内容:Array([Id]=>Array([Id]=>000001[Quantity]=>40)?或者这将是非常罕见的ilogic?@RolandF您可以通过使用
$data=array\u值(sumArray($array,'Id','Quantity'))删除000001
。
我会证明这一点。谢谢您的回复
Array
(
[Cheese] => 60
[Ham] => 300
[Baicon] => 900
)