PHP将具有相同日期的数组更改为具有唯一日期和总计数的数组

时间:2016-04-13 02:44:28

标签: php arrays

我有一个如下所示的数组:

array
(
  [0] => array("date"=>'2016-01-01',"type"=>1),
  [1] => array("date"=>'2016-01-13',"type"=>1),
  [2] => array("date"=>'2016-01-03',"type"=>1),
  [3] => array("date"=>'2016-01-01',"type"=>1)
  ....
)

我想根据日期按唯一日期和总金额对它们进行排序:

array
(
  [0] => array("date"=>'2016-01-01',"type"=>1,"total"=>2),
  [1] => array("date"=>'2016-01-03',"type"=>1,"total"=>1),
  [2] => array("date"=>'2016-01-13',"type"=>1,"total"=>1)
  ....
)

数组函数中是否有任何PHP构建可以做到这一点? 或者我应该创建自己的功能?

4 个答案:

答案 0 :(得分:1)

不,当然没有单一的功能能够神奇地做到这一点,这可以通过多种功能来解决。

首先,您需要在键入时使用date对数组进行分组,将其放入新容器中

"date"=>'2016-01-01' // group it by this value

因此,为了做到这一点,您需要使用这些值作为索引来分配新值。

其次,要准备您的数组是可排序的,只需将那些将用于unix时间戳date的{​​{1}}密钥转换。因此,以后更容易理清。

总而言之,它看起来像这样:

strtotime

收集数组值后,您希望使用$new_array = array(); foreach($array as $v) { $date_key = strtotime($v['date']); // turn into unix time if(!isset($new_array[$date_key])) { // initialization // turn total to zero first $new_array[$date_key] = array_merge($v, array('total' => 0)); } $new_array[$date_key]['total']++; // increment }

对它们进行排序
ksort

Sample Output

答案 1 :(得分:0)

按日期字段分组,并使用COUNT作为总行数

$sql = "SELECT *, COUNT(date_field) as total 
FROM table 
GROUP BY date_field";
$qry = mysqli_query($con, $sql);
if (mysqli_num_rows($qry) > 0)
{
while ($res = mysqli_fetch_object($qry))
{
// Date Array
}
}

答案 2 :(得分:0)

仅供参考:

$arr = [
  0 => array("date"=>'2016-01-01',"type"=>1),
  1 => array("date"=>'2016-01-13',"type"=>1),
  2 => array("date"=>'2016-01-03',"type"=>1),
  3 => array("date"=>'2016-01-01',"type"=>1)
];

// count
$date_arr = array_column($arr, 'date');
$times_arr = array_count_values($date_arr);
$date_arr = array_map(function($value){
	global $times_arr;
	$value['total'] = $times_arr[$value['date']];
	return $value;
}, $arr);

// unique
$date_arr = array_map('unserialize', array_unique(array_map('serialize', $date_arr)));

var_dump($date_arr);exit;

答案 3 :(得分:-2)

可能只是

$array[0]["total"] = 2;
$array[1]["total"] = 1;
$array[2]["total"] = 1;
...