PHPフィルタ配列値と多次元配列からの重複を削除する
-
20-12-2019 - |
質問
こんにちは、この配列から重複するX値を見つけてそれらを削除しようとしていて、一意のものを残してみるだけです。たとえば、私の配列は
ですArray
(
[0] => Array
(
[x] => 0.5
[y] => 23
)
[1] => Array
(
[x] => 23
[y] => 21.75
)
[2] => Array
(
[x] => 14.25
[y] => 21.875
)
[3] => Array
(
[x] => 19.375
[y] => 21.75
)
[4] => Array
(
[x] => 9.125
[y] => 21.875
)
[5] => Array
(
[x] => 23
[y] => 19.625
)
[6] => Array
(
[x] => 19.375
[y] => 19.625
)
)
.
だから私が起こる必要があるのは全体を通してループすることで、最初のx値を.5として続け、それ以外はxをxとしてxを持っています。この
のように Array
(
[0] => Array
(
[x] => 0.5
[y] => 23
)
[1] => Array
(
[x] => 23
[y] => 21.75
)
[2] => Array
(
[x] => 14.25
[y] => 21.875
)
[3] => Array
(
[x] => 19.375
[y] => 21.75
)
[4] => Array
(
[x] => 9.125
[y] => 21.875
)
)
.
ここですべてのX値が一意である。私はオンラインで検索し、この関数を使うことを見つけたが、これはうまくいかないように思われる:
$result = array_map("unserialize", array_unique(array_map("serialize", $array)));
. 解決
行くだけで、あなたが行くにつれてユニークな値を見つけるだけです:
$taken = array();
foreach($items as $key => $item) {
if(!in_array($item['x'], $taken)) {
$taken[] = $item['x'];
} else {
unset($items[$key]);
}
}
.
x
の値が初めて使用されている場合は、それを保存し、それ以降の使用方法は配列からのunset
です。
他のヒント
array_unique
文字列の値を比較するため、中間ステップとして(オーバーロードされた__toString
関数を持つ)オブジェクトを作成できます。
class XKeyObj {
public $x;
public $y;
public function XKeyObj($x, $y) {
$this->x = $x;
$this->y = $y;
}
public function __toString() { return strval($this->x); }
}
function array_to_xKey($arr) { return new XKeyObj($arr['x'], $arr['y']); }
function xKey_to_array($obj) { return array('x' => $obj->x, 'y' => $obj->y); }
$input = array(
array('x' => 0.5, 'y' => 23),
array('x' => 23, 'y' => 21.75),
array('x' => 14.25, 'y' => 21.875),
array('x' => 19.375, 'y' => 21.75),
array('x' => 9.125, 'y' => 21.875),
array('x' => 23, 'y' => 19.625),
array('x' => 19.375, 'y' => 19.625)
);
$output = array_map('xKey_to_array',
array_unique(array_map('array_to_xKey', $input)));
print_r($output);
.
結果:
Array
(
[0] => Array
(
[x] => 0.5
[y] => 23
)
[1] => Array
(
[x] => 23
[y] => 21.75
)
[2] => Array
(
[x] => 14.25
[y] => 21.875
)
[3] => Array
(
[x] => 19.375
[y] => 21.75
)
[4] => Array
(
[x] => 9.125
[y] => 21.875
)
)
. アレイの繰り返しチェックを実行すると、一時ルックアップアレイがサイズが大きくなるにつれてPerformance Dragが次第に悪化します。
これを念頭に置いて、一時的な連想キーを使用して後続の重複を識別して、in_array()
を増やし結果変数で呼び出すことができます。 PHPアレイはハッシュマップであるため、このテクニックは常に!isset()
を凌駕します。
コード:(デモ)
$array = [
['x' => 0.5, 'y' => 23],
['x' => 23, 'y' => 21.75],
['x' => 14.25, 'y' => 21.875],
['x' => 19.375, 'y' => 21.75],
['x' => 9.125, 'y' => 21.875],
['x' => 23, 'y' => 19.625],
['x' => 19.375, 'y' => 19.625],
];
foreach ($array as $row) {
if (!isset($result['#' . $row['y']])) {
$result['#' . $row['y']] = $row;
}
}
var_export(array_values($result));
.
出力:
array (
0 =>
array (
'x' => 0.5,
'y' => 23,
),
1 =>
array (
'x' => 23,
'y' => 21.75,
),
2 =>
array (
'x' => 14.25,
'y' => 21.875,
),
3 =>
array (
'x' => 23,
'y' => 19.625,
),
)
.
p.S。 StringまたはInteger値を一時的なキーとして処理する場合は、文字を先頭に追加する必要はありません。結果から一時キーを削除することを気にしない場合(サブアレイ値 "down script"のみにアクセスしているため、繰り返しの後にin_array()
を呼び出す必要はありません。
array_unique(my_array, SORT_REGULAR)
.