我有一个这样的数组:
Array
(
[0] => Array
(
[date] => 2016-03-10
[booked] => 1
)
[1] => Array
(
[date] => 2016-03-10
[booked] => 1
)
[2] => Array
(
[date] => 2016-03-12
[booked] =>
)
[3] => Array
(
[date] => 2016-03-12
[booked] => 1
)
)
我想要做的是按以下格式创建一个新数组:
Array
(
[0] => Array (
(
[date] => 2016-03-10
[allgames] => 2
[booked] => 2
)
[1] => Array (
(
[date] => 2016-03-12
[allgames] => 2
[booked] => 1
)
)
所以基本上我将日期分组在一起,计算它们出现在原始数组中的次数以及它们中有多少已被预订"。但是,我似乎无法做到正确,而且我不确定如何让第二个阵列发生。
我该怎么做?
答案 0 :(得分:1)
初始化新数组,检查原始数组的每个项目并增加booked
和allgames
,使用date
作为新数组键。最后使用array_values
删除日期键。
$result = array();
foreach( $array as $key => $val )
{
if( !isset( $result[ $val['date'] ] ) )
{
$result[ $val['date'] ] = array
(
'date' => $val['date'],
'booked' => 0,
'allgames' => 0
);
}
$result[ $val['date'] ]['allgames']++;
if( $val['booked'] ) $result[ $val['date'] ]['booked']++;
}
$result = array_values( $result );
的 eval.in demo 强>
根据评论,如果您的数组来自数据库查询,您可以直接从mySQL查询中获得相同的结果。
修改强>
我打算将booked
键设为True / False(0/1),但是 - 如果它可以有任何整数 - 你必须以这种方式修改上面的代码:
if( $val['booked'] ) $result[ $val['date'] ]['booked'] += $val['booked'];
关于allgames
密钥,我认为它们必须保持不变(=总记录),否则其总数不一致。
答案 1 :(得分:1)
你应该尝试用SQL查询来解决这个问题。
<?php
$array = [
[
"date" => '2016-03-10',
"booked" => 1
],
[
"date" => '2016-03-10',
"booked" => 1
],
[
"date"=> '2016-03-12',
"booked" => null
],
[
"date" => '2016-03-12',
"booked" => 1
]
];
递归函数将日期设置为数组键的新数组,只是因为我觉得可以使用递归。
function groupMatchingDates($arr, $newarr = []) {
if(empty($arr)) {
return array_values($newarr);
} else {
$newArrayItem = array_shift($arr);
if(!isset($newarr[$newArrayItem['date']])) {
$newarr[$newArrayItem['date']] = [
'allgames' => 1,
'date' => $newArrayItem['date'],
'booked' => $newArrayItem['booked']
];
} else {
$newarr[$newArrayItem['date']]['allgames']++;
$newarr[$newArrayItem['date']]['booked'] += $newArrayItem['booked'];
}
return groupMatchingDates($arr, $newarr);
}
}
$ newArr = groupMatchingDates($ array);
的var_dump($ newArr);
array(2) {
[0]=>
array(3) {
["allgames"]=>
int(2)
["date"]=>
string(10) "2016-03-10"
["booked"]=>
int(2)
}
[1]=>
array(3) {
["allgames"]=>
int(2)
["date"]=>
string(10) "2016-03-12"
["booked"]=>
int(1)
}
}