簡體   English   中英

PHP Array Goup使用具有多個鍵的日期並分配鍵總和

[英]PHP Array Goup using date with multiple keys and assign Sum of keys

我正在擰PHP腳本,以使用日期對一些付款信息進行分組。 原始數組的一部分是這樣的。

 array(50) {
  [0]=>
  array(2) {
    ["Datum"]=>
    string(10) "2016-07-07"
    ["C"]=>
    int(1)
  }
  [1]=>
  array(2) {
    ["Datum"]=>
    string(10) "2016-07-07"
    ["C"]=>
    int(1)
  }
  [2]=>
  array(2) {
    ["Datum"]=>
    string(10) "2016-07-07"
    ["Paypal"]=>
    int(1)
  }
  [3]=>
  array(2) {
    ["Datum"]=>
    string(10) "2016-07-07"
    ["Bank"]=>
    int(1)
  }
  [4]=>
  array(2) {
    ["Datum"]=>
    string(10) "2016-07-12"
    ["C"]=>
    int(1)
  }
  [5]=>
  array(2) {
    ["Datum"]=>
    string(10) "2016-06-13"
    ["C"]=>
    int(1)
  }
  [6]=>
  array(2) {
    ["Datum"]=>
    string(10) "2016-06-13"
    ["C"]=>
    int(1)
  }
  [7]=>
  array(2) {
    ["Datum"]=>
    string(10) "2016-06-13"
    ["Afterpay"]=>
    int(1)
  }
  [8]=>
  array(2) {
    ["Datum"]=>
    string(10) "2016-06-13"
    ["C"]=>
    int(1)
  }
  [9]=>
  array(2) {
    ["Datum"]=>
    string(10) "2016-06-13"
    ["C"]=>
    int(1)
  }
  [10]=>
  array(2) {
    ["Datum"]=>
    string(10) "2016-06-12"
    ["C"]=>
    int(1)
  }
  [11]=>
  array(2) {
    ["Datum"]=>
    string(10) "2016-06-13"
    ["C"]=>
    int(1)
  }
  [12]=>
  array(2) {
    ["Datum"]=>
    string(10) "2016-06-13"
    ["C"]=>
    int(1)
  }
  [13]=>
  array(2) {
    ["Datum"]=>
    string(10) "2016-06-13"
    ["C"]=>
    int(1)
  }
  [14]=>
  array(2) {
    ["Datum"]=>
    string(10) "2016-06-13"
    ["C"]=>
    int(1)
  }
  [15]=>
  array(2) {
    ["Datum"]=>
    string(10) "2016-06-13"
    ["C"]=>
    int(1)
  }
  [16]=>
  array(2) {
    ["Datum"]=>
    string(10) "2016-06-13"
    ["C"]=>
    int(1)
  }
  [17]=>
  array(2) {
    ["Datum"]=>
    string(10) "2016-06-13"
    ["C"]=>
    int(1)
  }
  [18]=>
  array(2) {
    ["Datum"]=>
    string(10) "2016-06-14"
    ["Afterpay"]=>
    int(1)
  }
  [19]=>
  array(2) {
    ["Datum"]=>
    string(10) "2016-06-14"
    ["C"]=>
    int(1)
  }
    }

我寫了一些代碼按日期對它們進行分組。 這是我的代碼

//$shipment - this is the original array
    $array1 = array('C' => null, 'afterpay' => null,'paypal' => null, 'Bank' => null, 'Ideal' => null);
    $array2 = array();

    array_walk($shipment, function ($v) use (&$array2, $array1) {
        $a = $v['Datum'];
        if (!isset($array2[$a])) {
            $array2[$a] = $array1;
        }
        unset($v['Datum']);
        $array2[$a] = array_merge($array2[$a], $v);
    });

分組后輸出

Array
(
    [2016-07-07] => Array
        (
            [C] => 1
            [afterpay] => 
            [paypal] => 
            [Bank] => 1
            [Ideal] => 
            [Paypal] => 1
        )

    [2016-07-12] => Array
        (
            [C] => 1
            [afterpay] => 
            [paypal] => 
            [Bank] => 
            [Ideal] => 
        )

    [2016-06-13] => Array
        (
            [C] => 1
            [afterpay] => 
            [paypal] => 
            [Bank] => 
            [Ideal] => 
            [Afterpay] => 1
        )

    [2016-06-12] => Array
        (
            [C] => 1
            [afterpay] => 
            [paypal] => 
            [Bank] => 
            [Ideal] => 
        )

    [2016-06-14] => Array
        (
            [C] => 1
            [afterpay] => 
            [paypal] => 
            [Bank] => 
            [Ideal] => 
            [Afterpay] => 1
        )
)

但我很難找到一種方法來計算付款方式編號並為其分配

2016-07-07數組的示例應為C = 2,貝寶= 1,銀行= 1

[2016-07-07] => Array
            (
                [C] => 2
                [afterpay] => 
                [paypal] => 
                [Bank] => 1
                [Ideal] => 
                [Paypal] => 1
            )

有人可以幫助我添加一些代碼以獲取付款方式總和並進行分配,非常感謝

發生這種情況是因為如果2個鍵相同,則array_merge會覆蓋數據-您需要添加所有字段。

首先,將$array1的init字段更改為0而不是null

其次,在您的array_walk ,替換$array2[$a] = array_merge($array2[$a], $v); 有:

foreach($v as $k => $v)
    $array2[$a][$k] += $v;

這樣您將累加每個類別

我們需要增加付款方式而不是合並數組,以防止覆蓋舊值。 下面的代碼為我工作

<?php
$shipment = [
    [
        'Datum' => '2016-07-07',
        'C' => 1,
    ],
    [
        'Datum' => '2016-07-07',
        'C' => 1,
    ],
    [
        'Datum' => '2016-07-07',
        'Paypal' => 1,
    ],
    [
        'Datum' => '2016-07-07',
        'Bank' => 1,
    ],
    [
        'Datum' => '2016-07-12',
        'Bank' => 1,
    ],
];

$template = ['C' => 0, 'Afterpay' => 0, 'Paypal' => 0, 'Bank' => 0, 'Ideal' => 0];
$result = [];

array_walk($shipment, function ($v) use (&$result, $template) {
    // Init by Datum if it is not in array
    $date = $v['Datum'];
    if (!isset($result[$date])) {
        $result[$date] = $template;
    }

    // Unset Datum to get final payment method only
    unset($v['Datum']);
    $itemKey = array_keys($v)[0];

    // Increase number
    $result[$date][$itemKey] += $v[$itemKey];
});

// Dump result
var_dump($result);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM