質問

こんにちは、この配列から重複する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()を凌駕します。

これらの一時キーを持つGOTCHAがあります。 floatsをアレイキーとして使用すると、PHPは切り捨てによってそれらを整数に変換します( "Flooring" Not "丸め) ")。この不要な副作用を避けるために、フロートが文字列になるように、(もちろんハイフン以外の)非数字文字(もちろんハイフン以外)を一時キーに依頼します。

コード:(デモ

$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)
.
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top