현재 위치: > 최신 기사 목록> 어레이의 객체를 계산할 수없는 이유는 무엇입니까?

어레이의 객체를 계산할 수없는 이유는 무엇입니까?

M66 2025-06-07

PHP는 array_count_values ​​기능이 매우 일반적이고 유용한 기능인 강력한 배열 처리 기능을 제공하는 널리 사용되는 서버 측 프로그래밍 언어입니다. array_count_values ​​함수의 함수는 배열에서 모든 요소의 발생 빈도를 계산하는 것입니다. 키가 원래 배열의 요소 인 경우 배열을 반환하고 값은 요소의 발생 수입니다. 그러나 객체가 포함 된 배열을 다룰 때는 예상치 못한 동작을 겪을 수 있으며, 특히 객체의 배열에 대해 부정확 한 통계 결과가 발생할 수 있습니다.

1. array_count_values ​​기능의 작동 방식

array_count_values ​​함수의 기본 함수는 배열을 반복하고 각 요소의 발생 수를 계산하는 것입니다. 결과는 키 값 쌍의 형태로 리턴됩니다. 예를 들어 간단한 배열이 있다고 가정합니다.

 $array = ['apple', 'banana', 'apple', 'orange', 'banana', 'banana'];
$result = array_count_values($array);
print_r($result);

출력은 다음과 같습니다.

 Array
(
    [apple] => 2
    [banana] => 3
    [orange] => 1
)

보시다시피, array_count_values는 각 요소의 발생 수를 올바르게 계산합니다.

2. 배열의 물체가 왜 부정확 한 계산을 일으키는가?

객체를 PHP 배열에 저장하면 array_count_values ​​함수가 예상대로 작동하지 않을 수 있습니다. 객체는 참조별로 전달되기 때문에 PHP의 객체는 메모리 주소 (값이 아님)로 비교되기 때문입니다. 즉, 두 객체가 동일하게 보이더라도 메모리 주소가 다르므로 다른 객체로 간주됩니다.

간단한 예를 살펴 보겠습니다.

 class Fruit {
    public $name;
    public function __construct($name) {
        $this->name = $name;
    }
}

$apple1 = new Fruit('apple');
$apple2 = new Fruit('apple');

$array = [$apple1, $apple2, $apple1];
$result = array_count_values($array);
print_r($result);

출력 결과는 다음과 같습니다.

 Array
(
    Object(Fruit)#1 => 2
    Object(Fruit)#2 => 1
)

우리는 동일한 이름을 가진 두 개의 Apple 객체가 있지만 두 개의 다른 인스턴스 (즉, 다른 메모리 주소)이므로 Array_count_values 는 다른 요소로 취급하여 별도로 계산합니다.

3. array_count_values ​​및 객체 배열의 특정 영향

array_count_values를 사용하여 객체가 포함 된 배열을 처리하려고하면 객체의 실제 내용이 아니라 각 객체의 메모리 주소를 계산합니다. 이것은 다음과 같은 문제로 이어질 수 있습니다.

  • 동일한 내용을 가진 객체의 여러 인스턴스가있는 경우 다른 용어로 계산되면 결과가 부정확합니다.

  • 동일한 클래스의 여러 개체 인스턴스를 사용하는 경우 Array_Count_Values는 이러한 객체의 속성이 정확히 동일하더라도 동일한 요소로 처리하지 않습니다.

4.이 문제를 해결하는 방법은 무엇입니까?

객체가 포함 된 배열을 올바르게 처리하려면 다음 방법을 수행 할 수 있습니다.

  1. __TOSTRING 방법을 다시 작성하십시오 .

    객체에 고유 한 문자열 표현 (예 : 객체의 속성 값)이있는 경우 객체의 __toString 메소드를 무시하여 객체를 문자열로 변환하여 array_count_values를 문자열에 따라 계산할 수 있습니다.

     class Fruit {
        public $name;
        public function __construct($name) {
            $this->name = $name;
        }
        public function __toString() {
            return $this->name;
        }
    }
    
    $apple1 = new Fruit('apple');
    $apple2 = new Fruit('apple');
    $array = [$apple1, $apple2, $apple1];
    $result = array_count_values($array);
    print_r($result);
    

    출력 결과는 다음과 같습니다.

     Array
    (
        [apple] => 3
    )
    

    이를 통해 동일한 이름의 객체를 올바르게 계산할 수 있습니다.

  2. Array_Map을 사용하고 Serialize를 사용하십시오 .

    __toString 메소드에 의존하지 않으려면 Serialize를 사용하여 개체를 문자열로 변환 한 다음 계산에 Array_Count_Values를 사용할 수 있습니다.

     $array = [serialize($apple1), serialize($apple2), serialize($apple1)];
    $result = array_count_values($array);
    print_r($result);
    

    출력은 다음과 같습니다.

     Array
    (
        [O:6:"Fruit:..."] => 3
    )
    

    이 방법에서는 array_count_values가 동일한 객체의 횟수를 올바르게 계산할 수 있도록 Serialize를 통해 객체를 고유 한 문자열로 변환합니다.

5. 요약

Array_Count_Values를 사용하여 객체가 포함 된 배열을 처리 할 때 Array_Count_Values는 객체가 메모리 주소로 비교되므로 동일한 내용으로 객체를 올바르게 계산하지 않을 수 있습니다. 이 문제는 __toString 메소드를 덮어 쓰거나 Serialize 메소드를 사용하여 효과적으로 해결할 수 있으며 Array_Count_Values는 객체 배열의 요소를 올바르게 계산합니다.