문제

안녕하세요 여러분 저는 이 배열에서 중복된 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가 .5인 다른 항목을 배열에서 제거하여 마지막에 다음과 같은 배열을 갖게 하는 것입니다.

 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
        )

)
.

어레이에 대해 반복 검사를 수행할 때 성능이 저하됩니다. in_array() 임시 조회 배열의 크기가 증가함에 따라 점차적으로 악화됩니다.

이를 염두에 두고 임시 연관 키를 사용하여 후속 중복을 식별하십시오. !isset() 성장하는 결과 변수에 대해 호출할 수 있습니다.PHP 배열은 해시 맵이므로 이 기술은 지속적으로 더 나은 성능을 발휘합니다. in_array().

특히 float 유형 값에 적용되는 임시 키에 문제가 있습니다. 부동 소수점이 배열 키로 사용될 때, PHP는 이를 잘라내어("반올림"이 아닌 "바닥재") 정수로 변환합니다.이러한 원치 않는 부작용을 피하려면 부동 소수점이 문자열이 되도록 임시 키 앞에 숫자가 아닌 문자(물론 하이픈 제외)를 추가하세요.

암호:(데모)

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

추신.문자열 또는 정수 값을 임시 키로 처리하는 경우 앞에 문자를 추가할 필요가 없습니다.결과에서 임시 키를 제거하는 데 신경 쓰지 않는 경우(하위 배열 값 "다운 스크립트"에만 액세스하기 때문에) 호출할 필요가 없습니다. array_values() 반복 후.

array_unique(my_array, SORT_REGULAR)
.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top