0

たとえば、それぞれ1000個のキーを持つ2つの配列があり、1つは温度値を保持し、もう1つは時間を保持します。

配列温度の例:

[0] = 3.1
[1] = 4.3
[2] = 4.1
[3] = 5.1
[4] = 4.1

時間配列の例:

[0] = 0
[1] = 1
[2] = 2
[3] = 3
[4] = 3

これに伴う問題は、これらを配列に結合して、たとえばpchartにプロットすると、Xの値が多すぎて、乱雑になることです。
したがって、重複する時間を削除してから「NULL」に置き換える必要があるので、不要な時間がx軸にプロットされません。
配列の最初の1時間を保持したいので、重複の最後から2番目を「NULL」に設定できます

時間出力配列は次のようになります。

[0] = 0
[1] = 1
[2] = 2
[3] = 3
[4] = NULL
etc.
4

5 に答える 5

3

の仕事のように聞こえarray_unique()ます。

array array_unique ( array $array [, int $sort_flags = SORT_STRING ] )

入力配列を受け取り、重複する値のない新しい配列を返します。

キーは保持されることに注意してください。array_unique()は、最初は文字列として扱われる値を並べ替えてから、すべての値で最初に検出されたキーを保持し、後続のすべてのキーを無視します。ソートされていない配列からの最初の関連する値のキーが保持されるという意味ではありません。

注:2つの要素は、がの場合にのみ等しいと見なされ(string) $elem1 === (string) $elem2ます。つまり、文字列表現が同じ場合。最初の要素が使用されます。


配列キーを永続化する必要がある場合は、を使用して何かを試すことができますarray_map()

<?php

//Variable initialization
$array = array(
    0 => 0,
    1 => 1,
    2 => 2,
    3 => 3,
    4 => 3
);
$temp  = array();

$array = array_map(function($element) use (&$temp) {
    if (!in_array($element, $temp)) {
        $temp[] = $element;
        return $element;
    }
    return null;
}, $array);

print_r($array);
于 2012-05-03T16:59:47.837 に答える
2

あなたの配列はソートされているので...これはどうですか?

$hours = array(0,1,2,3,3,4,4,5);
$prev = -1;
foreach ($hours as &$hour) {
  if ($prev === $hour) {
    $hour = NULL;
  }
  else {
    $prev = $hour;
  }
}
unset($hour);
print_r($hours); // 0,1,2,3,NULL,4,NULL,5...
于 2012-05-03T17:05:24.270 に答える
1

php 5.3を使用している場合:

$a = array(0,1,2,3,4,4,5);

array_walk($a, function(&$item) {
  static $encountered = array();
  if(in_array($item, $encountered)) {
    $item = null;
    return;
  }
  $encountered[] = $item;
});

var_dump($a);

キーの数を保持します。Array_walkは、すべてのキーに対してユーザー関数を呼び出します。staticは、関数のスコープ内の$encountered配列が実行の間にとどまるようにします。

于 2012-05-03T17:05:07.963 に答える
0

重複を完全に削除したい場合は、array_unique()を使用できます が、NULLには設定されません。

于 2012-05-03T17:01:09.397 に答える
-2

多分このトリックはそれをします:

$simplified = array_combine($hours, $temperatures);

$hours = array_keys($simplified);
$temperatures = array_values($simplified);

これは物事をNULLに設定しませんが、あなたが探しているものであると私が思うそれらを完全に削除します。そうでなければ、これはそれを行う必要があります:

foreach(array_slice(array_reverse(array_keys($hours)), 0, -1) as $i)
    ($hours[$i] === $hours[$i-1]) && $hours[$i] = NULL;

デモ

于 2012-05-03T17:02:02.780 に答える