PHP删除数组中重复的日期实例

PHP删除数组中重复的日期实例,php,arrays,Php,Arrays,我尝试了各种排列的array\u unique,并在这里搜索了关于从数组中删除重复值的其他一般问题,但我无法确定我需要的答案。我有一个传递日期和值的数组,每个日期只想查看一次日期值 我用这个做谷歌图表,只希望每个日期的日期标签显示一次。我不想把它完全去掉,因为我想把它画在图表上 因此,将传递一个示例数组: ["June 4",30],["June 4",35],["June 5",46],["June 5",38.33],["June 5",12] 以及我想要它的方式: ["June 4"

我尝试了各种排列的
array\u unique
,并在这里搜索了关于从数组中删除重复值的其他一般问题,但我无法确定我需要的答案。我有一个传递日期和值的数组,每个日期只想查看一次日期值

我用这个做谷歌图表,只希望每个日期的日期标签显示一次。我不想把它完全去掉,因为我想把它画在图表上

因此,将传递一个示例数组:

["June 4",30],["June 4",35],["June 5",46],["June 5",38.33],["June 5",12]  
以及我想要它的方式:

["June 4",30],["",35],["June 5",46],["",38.33],["",12] 

想法?

这是解决您问题的一种可能的方法,尽管我建议按照帕塔苏和尼古拉R的说法重新构建

$untrimmed = [["June 4",30],["June 4",35],["June 5",46],["June 5",38.33],["June 5",12]];
$trimmed = stripDates($untrimmed);

function stripDates($dates) {
    foreach( $dates as $key=>$date ) {
        if ($key>0) {
            if ($date[0] === $dates[$key-1][0]) {
                $dates[$key][0] = "";
            } else if($dates[$key-1][0] === "") {
                for ($i = $key-1; $i > -1; $i--) {
                   if ($date[0] === $dates[$i][0]) $dates[$key][0] = "";
                   if ($dates[$key] != "") break;
                }
            }
        }
    }
    return $dates;
}

// Note: This would require dates to be added chronically
//Output: ["June 4",30],["",35],["June 5",46],["",38.33],["",12]
我想推荐如下:

$unconstructed = [["June 4",30],["June 4",35],["June 5",46],["June 5",38.33],["June 5",12]];
$constructed = constructAssoc($unconstructed);

function constructAssoc($dates) {
    $constructed = array();
    foreach( $dates as $index=>$date ) {
        if (!array_key_exists($date[0], $constructed)) {
            $constructed[$date[0]] = array("index"=>$index, "value"=>$date[1]);
        } else {
            array_push($constructed[$date[0], ["index"=>$index,"value"=>$date[1]]);
        }
    }
    return $constructed;
}

//Output: ["June 4"=> [["index"=>0, "value"=>30], ["index"=>1, "value"=>35]], "June 5"=>[["index"=>2, "value"=>46], ["index"=>3, "value"=>38.33], ["index"=>4, "value"=>12]]]

注意:如果需要更精确的重新构造,请在推荐的解决方案中添加索引。

因为您正在使用数据输入到google图表中,我假设您确切地知道输出数据所需的内容。上面已经有一些关于更好地构建数据结构的建议,但这可能不会直接适用于谷歌图表

这个怎么样

$data = [["June 4",30],["June 4",35],["June 5",46],["June 5",38.33],["June 5",12]];
$found = array();
foreach ($data as $i => $x) {
    if (in_array($x[0], $found)) {
        $data[$i][0] = '';
    } else {
        $found[] = $x[0];
    }
}
print_r($data);
基本上,它只是建立一个已经看到的日期列表。我们循环浏览数据,检查是否看到日期。。。如果有,我们会从数据中清除它,否则我们会将其保存到列表中,以便下次清除

这里有一个替代解决方案,它只检查连续的重复日期,与第一个解决方案不同,第一个解决方案将删除所有重复的日期。这可能更接近于绘制图表所需的内容:

$data = [["June 4",30],["June 4",35],["June 5",46],["June 5",38.33],["June 5",12]];
$last = '';
foreach ($data as $i => $x) {
    if ($x[0] == $last) {
        $data[$i][0] = '';
    } else {
        $last = $x[0];
    }
}
print_r($data);

在这种情况下,我们只是跟踪我们最后看到的日期。。。如果我们的新日期与之匹配,我们将其清除。

创建一个从日期标签到值的关联数组?这样,如果您添加两个具有相同日期标签的条目,您将只得到一个条目,因此只有一个值。我将重新构造类似数组的数组(“June 4”=>array(30,35))等等…您是否已经有了这方面的实际示例代码。在当前的结构中,您所拥有的方式不会按照您希望的方式工作。你如何开始获取日期和值?因为他正在将数据输入谷歌图表,所以重新构造数据可能不太现实。。。他将重新构造、处理,然后再转换回这种格式以绘制图表。如果数据集变得非常大,此解决方案中的嵌套循环将开始花费很长时间-对于您推荐的解决方案,这是一种O(n^2)算法,他如何将其恢复到绘制图表所需的格式?添加了一个中断解决方案以获得更好的性能。对于第二条评论,除非在每个值中添加每个索引,否则不可能将它们放在相同的位置。