현재 위치: > 최신 기사 목록> php에서 array_flip () 함수가 연관 배열의 객체를 값으로 올바르게 처리 할 수 ​​있습니까?

php에서 array_flip () 함수가 연관 배열의 객체를 값으로 올바르게 처리 할 수 ​​있습니까?

M66 2025-06-03

php에서 array_flip () 함수는 배열의 키와 값을 교환하는 데 사용되며, 배열의 모든 키를 값으로 값, 키로 값으로, 새 배열을 반환합니다. 일반 배열 값의 경우 Array_flip ()가 매우 매끄럽게 실행됩니다. 그러나이 함수가 연관 배열의 값으로 값으로 값을 처리하는 방법에 대한 심층적 인 논의가 필요할 수 있습니다.

array_flip () 함수의 기본 사용

먼저 Array_flip () 의 기본 사용법을 살펴 보겠습니다. 간단한 연관 배열이 있다고 가정하면 코드는 다음과 같습니다.

 $array = [
    "a" => "apple",
    "b" => "banana",
    "c" => "cherry"
];

$flipped = array_flip($array);

print_r($flipped);

출력은 다음과 같습니다.

 Array
(
    [apple] => a
    [banana] => b
    [cherry] => c
)

위에서 볼 수 있듯이 Array_flip ()는 배열 값을 키로 변환하고 원래 키는 값이됩니다. 이 작업은 매우 직접적이며 기본 데이터 유형 (예 : 문자열, 정수 등)에서 매우 잘 수행됩니다.

객체를 값으로 사용할 때 동작

배열의 값이 객체 인 경우 array_flip () 의 동작은 그렇게 간단하지 않습니다. 다음 코드를 살펴 보겠습니다.

 class Fruit {
    public $name;

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

$array = [
    "a" => new Fruit("apple"),
    "b" => new Fruit("banana"),
    "c" => new Fruit("cherry")
];

$flipped = array_flip($array);
print_r($flipped);

출력이 다음과 같이 기대할 수 있습니다.

 Array
(
    [apple] => a
    [banana] => b
    [cherry] => c
)

그러나 실제 결과는 아닙니다. PHP는 객체를 Array_flip () 에게 값으로 전달하려고 할 때 문제가 발생합니다. 객체는 배열의 키로 사용할 수 없기 때문입니다. PHP는 객체를 새로운 키로 문자열로 변환하려고 시도하지만 기본적으로 객체는 클래스 이름과 내부 고유 식별자 (예 : 과일#1 )로 표시됩니다.

따라서 위의 코드의 출력은 다음과 같습니다.

 Array
(
    [Fruit#1] => a
    [Fruit#2] => b
    [Fruit#3] => c
)

객체의 비교는 내용이 아닌 인스턴스 식별자를 기반으로하기 때문에 Array_flip () 는 객체 값을 직접 키로 변환 할 수 없음을 보여줍니다.

이 문제가 발생하는 이유는 무엇입니까?

PHP의 객체는 원시 데이터 유형과 직접 복사되지 않고 참조별로 전달됩니다. 객체 비교는 속성이나 값이 아닌 메모리 내 참조를 기반으로합니다. 따라서 array_flip () 가 객체를 배열의 키로 사용하려고 할 때 실제로 내용이 아닌 객체에 대한 참조를 다루고 있습니다.

또한 객체의 식별자가 동적이므로 PHP는 유효한 키로 직접 변환 할 수 없습니다. 유효한 배열 키는 정수 또는 문자열과 같은 스칼라 유형이어야하며 객체 참조는이 조건을 충족하지 않습니다.

해결책

배열에서 객체 값을 실제로 교체 해야하는 경우 다음 솔루션을 고려할 수 있습니다.

  1. 객체를 문자열로 변환하십시오 . __toString () 메소드를 구현하여 개체를 문자열로 변환합니다. 이를 통해 Array_flip ()는 이 문자열 값을 새 키로 사용할 수 있습니다.

 class Fruit {
    public $name;

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

    public function __toString() {
        return $this->name;
    }
}

$array = [
    "a" => new Fruit("apple"),
    "b" => new Fruit("banana"),
    "c" => new Fruit("cherry")
];

$flipped = array_flip($array);
print_r($flipped);

출력은 다음과 같습니다.

 Array
(
    [apple] => a
    [banana] => b
    [cherry] => c
)
  1. 객체의 속성을 사용하십시오 . 개체에 사용 가능한 속성이 포함 된 경우 이러한 속성을 키로 사용할 수도 있습니다. 객체의 특성을 추출하여 배열로 변환 한 다음 Array_flip ()를 사용합니다.

 $array = [
    "a" => new Fruit("apple"),
    "b" => new Fruit("banana"),
    "c" => new Fruit("cherry")
];

$processedArray = [];
foreach ($array as $key => $fruit) {
    $processedArray[$fruit->name] = $key;
}

print_r($processedArray);

출력은 동일합니다.

 Array
(
    [apple] => a
    [banana] => b
    [cherry] => c
)

결론적으로

Array_flip () 함수는 객체를 값으로 올바르게 처리하지 않고 배열의 키로 변환하지 않습니다. 객체 값을 처리 해야하는 경우 __toString () 메소드를 사용하여 개체를 문자열로 변환하거나 객체의 속성을 키로 사용하는 것을 고려할 수 있습니다.