Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用多维数组实现excel的小计功能?_Php_Arrays_Arraylist_Multidimensional Array_Web Applications - Fatal编程技术网

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”),我想要下一个:

  • 我想让函数比较cond1和cond2是否真的是关联数组($product)中键的名称。这一步已经完成 我的问题是:

  • 如果名称(cond1、cond2)与数组的任何键相同,则它必须检查这些值​​在数组的cond1列中,查找重复的值 例如:

    假设cond1=“Name”,$products数组有一个名为“Name”的列,对于该字段,我们有以下值:“Cheese”、“Ham”、“Cheese”、“Ham”、“Baicon”、“Cheese”。因此,我需要识别和分组这些值​​这是重复的

  • 然后,假设cond2=“Prince”,$products数组有一个名为“Price”的列,那么,我必须添加在cond1中重复的字段的所有价格
  • 添加的结果应该是:对于“名称”=>“奶酪”,“价格”=>“60”

    这就是想法,类似于Excel中的函数小计

    这里我展示了我所完成的功能:

          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
    )