1

我尝试了 的各种排列array_unique,并在此处搜索了有关从数组中删除重复值的其他通用问题,但我无法完全确定我需要的答案。我有一个传递日期和值的数组,并且只想在每个日期查看一次 DATE 值。

我将其用于 Google 图表,并且只希望每个日期的日期标签显示一次。而且我不想完全删除它,因为我希望能够在图表上绘制它。

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

["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] 

想法?

4

2 回答 2

0

由于您使用数据输入谷歌图表,因此我假设您确切知道输出数据所需的内容。上面已经有一些关于构建数据的更好方法的建议,但这可能不适用于谷歌图表。

这个怎么样?

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

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

于 2013-06-05T05:51:56.697 回答
0

这是您的问题的一个可能的解决方案,尽管我建议像 Patashu & Nikola 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]]]

注意:如果需要更准确的重建,推荐解决方案中添加索引。

于 2013-06-05T05:48:44.697 回答