计算然后在PHP中对数组内的重复值进行分组

时间:2016-03-13 14:02:53

标签: php arrays

我有一个这样的数组:

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
            )
)

所以基本上我将日期分组在一起,计算它们出现在原始数组中的次数以及它们中有多少已被预订"。但是,我似乎无法做到正确,而且我不确定如何让第二个阵列发生。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

初始化新数组,检查原始数组的每个项目并增加bookedallgames,使用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)
  }
}