计算多维数组中的重复值并根据该值填充值

时间:2012-11-28 23:40:59

标签: php multidimensional-array count duplicates

我有以下数组:

Array
(
[0] => Array
    (
        [event_id] => 90
        [event_date] => 2012-11-29
        [multi] => 1
    )

[1] => Array
    (
        [event_id] => 86
        [event_date] => 2012-11-29
        [multi] => 1
    )

[2] => Array
    (
        [event_id] => 52
        [event_date] => 2012-11-30
        [multi] => 0
    )

)

我正在使用以下代码动态生成:

        $dates = array();
    $curr_date = array();
    $iteration_date = null;

    foreach ( $query as $q ) {
        $event_id = $q->ID;

        $curr_date['event_id'] = $event_id;
        $curr_date['event_date'] = date('Y-m-d', get_post_meta($event_id, 'event_unix_date', true));


        if ( empty($iteration_date) ) {
            $iteration_date = $curr_date['event_date'];
            $curr_date['multi'] = 1;
        } elseif ( $iteration_date == $curr_date['event_date'] ) {
            $curr_date['multi'] = 1;
        } else {
            $iteration_date = $curr_date['event_date'];
            $curr_date['multi'] = 0;
        }

        array_push($dates, $curr_date);
    }

这是基于MySQL数据库的结果。

我正在尝试做的是: 检查是否存在具有相同[event_date]的数组,如果是,计算多少,执行一段特殊代码(函数正常),并根据输出内容设置[multi]根据该条件,值为1,2或3。

基本逻辑是:

检查是否有多个[event_date]。如果有,请检查所有匹配的重复日期的类别。如果所有日期都是X,则将[multi]填充为1,如果所有日期均为Y,则填充2,如果日期为X& Y,填充3.如果只有一个日期,请填写1或2,具体取决于它所在的类别。

我认为通过循环遍历查询(它是DESC by event_date)我走在正确的轨道上,但这不会让我检查单个条目类别并根据它填充。

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:0)

您可以跟踪数组中的日期。然后,当您循环事件时,将该日期递增1。在循环结束时,您将知道每个日期有多少事件。然后你需要循环回来并添加你的多记录。您也可以使用日期数组作为循环。

$dates = new array();

foreach ( $query as $q ) {
  if(array_key_exists($q['event_date'], $dates)
    $dates[$q['event_date']]++;
  else
    $dates[$q['event_date']] = 1;
}

答案 1 :(得分:0)

我们每次都假设一个有序的多维数组(通过升序[event_date])吗? 如果是这样,你可以:

function multi_counter($big_array, $sorted, $storage){
$multi_count=0; // since by default there are no multiples
$multi_items=array(0); // starting at the beginning of the array
$length = count($big_array); // counting before loop
for($i=0;$i<$length-1;$i++){ // the -1 is so we don't get undefined index on last run
    if($big_array[$i][$sorted]===$big_array[$i+1][$sorted]){ //testing for similarity
        $multi_items[]=$i+1;        // adding the multi found to temp storage
        $multi_count++;             // adding to # of multis
// CALL A FUNCTION HERE SINCE THEY MATCH???
    }else{  
        foreach($multi_items as $key=>$multi){  // if not similar, go back and assign stored multis
            $big_array[$multi][$storage]=$multi_count;  // assigning stored vals
        }
        $multi_count=0; // resetting counter
        $multi_items=array($i+1); // resetting to next item
    }
}
foreach($multi_items as $key=>$multi){  // forcing assign at end of loop
    $big_array[$multi][$storage]=$multi_count; 
}
return $big_array; // returning the newly modified array

}

这就是你在说什么?你可以在我评论过的另一个函数中插入一个调用。问题不清楚,但这听起来像是你想要的。

该函数解析作为第一个参数给出的数组,检查每个子数组中第二个参数是否相似,并将它们存储在一个名为你为第三个参数放置的键中的子数组中。