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,Paypal = 1,Bank = 1
[2016-07-07] => Array
(
[C] => 2
[afterpay] =>
[paypal] =>
[Bank] => 1
[Ideal] =>
[Paypal] => 1
)
谁能帮我添加一些代码来获取付款方式的总和并分配,非常感谢
发生这种情况是因为 array_merge
如果 2 个键相同则覆盖数据 - 您需要的是添加所有字段。
首先,将 $array1
的初始字段更改为 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);
我正在编写一个 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,Paypal = 1,Bank = 1
[2016-07-07] => Array
(
[C] => 2
[afterpay] =>
[paypal] =>
[Bank] => 1
[Ideal] =>
[Paypal] => 1
)
谁能帮我添加一些代码来获取付款方式的总和并分配,非常感谢
发生这种情况是因为 array_merge
如果 2 个键相同则覆盖数据 - 您需要的是添加所有字段。
首先,将 $array1
的初始字段更改为 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);