我尝试了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]
想法?
答案 0 :(得分:0)
这可能是解决您问题的方法,但我建议重新构建Patashu& amp;尼古拉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]]]
注意:如果需要更准确的重构,请在推荐的解决方案中添加索引。
答案 1 :(得分:0)
由于您正在使用数据输入到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);
在这种情况下,我们只是跟踪我们看到的最后日期......如果我们的新日期与之相符,我们就会清除它。