PHP 배열 깊은 복사에 대한 다양한 접근 방식 살펴보기: 성능, 장단점

WBOY
풀어 주다: 2024-05-04 15:15:01
원래의
703명이 탐색했습니다.

PHP에서는 array_merge_recursive(), json_encode()/json_decode() 및 clone 메소드를 사용하여 배열을 복사할 수 있습니다. array_merge_recursive()는 중첩된 배열을 재귀적으로 병합하지만 속도가 느립니다. json_encode()/json_decode()는 더 빠르지만 메모리를 소비합니다. 복제는 가장 빠르지만 객체(배열 포함)에서만 작동합니다.

PHP 배열 깊은 복사에 대한 다양한 접근 방식 살펴보기: 성능, 장단점

PHP에서 배열을 깊게 복사하는 다양한 방법 살펴보기: 성능, 장점 및 단점

소개

배열 복사는 PHP에서 일반적인 작업입니다. 그러나 기본 할당 연산자는 배열의 복사본을 생성하지 않지만 원본 배열에 대한 참조를 생성합니다. 경우에 따라 이는 의도하지 않은 결과를 초래할 수 있습니다. 따라서 PHP에서 배열을 깊게 복사하는 다양한 방법과 그 장단점을 이해하는 것이 중요합니다.

방법 1: array_merge_recursive()

array_merge_recursive()이 함수는 여러 배열을 새 배열로 병합하는 동시에 중첩된 배열을 재귀적으로 병합합니다. 배열의 전체 복사본을 만드는 데 사용할 수 있습니다.array_merge_recursive()函数会将多个数组合并成一个新的数组,同时递归地合并任何嵌套的数组。它可以用来创建数组的深度副本。

$original = ['key1' => 'value1', 'key2' => ['subkey1' => 'subvalue1']]; $copy = array_merge_recursive([], $original);
로그인 후 복사

优点:

  • 简单易用。
  • 递归合并嵌套数组。

缺点:

  • 相对于其他方法速度较慢。
  • 可能导致栈溢出错误,如果数组过于嵌套。

方法 2:json_encode() 和 json_decode()

json_encode()函数将一个 PHP 变量转换为 JSON 字符串,json_decode()函数将 JSON 字符串转换为 PHP 变量。我们可以利用这些函数来创建数组的深度副本。

$original = ['key1' => 'value1', 'key2' => ['subkey1' => 'subvalue1']]; $copy = json_decode(json_encode($original), true);
로그인 후 복사

优点:

  • 相对于array_merge_recursive()速度较快。
  • 处理任意类型的数组。

缺点:

  • 对于大型数组,可能会消耗大量内存。

方法 3:使用clone

克隆对象也适用于数组,因为它会创建原始数组的一个完全独立的副本。

$original = ['key1' => 'value1', 'key2' => ['subkey1' => 'subvalue1']]; $copy = clone $original;
로그인 후 복사

优点:

  • 速度最快的深度复制方法。
  • 创建一个真正的副本,断开了与原始数组的联系。

缺点:

  • 只能用于对象(包括数组)。

实战案例

以下是一个实战案例,演示了如何使用 PHP 数组的深度复制:

 'John', 'age' => 25, 'address' => [ 'street' => 'Main Street', 'city' => 'Anytown' ] ]; // 创建使用不同方法的深度副本 $copy1 = array_merge_recursive([], $original); $copy2 = json_decode(json_encode($original), true); $copy3 = clone $original; // 验证副本与原始数组是否不同 var_dump($copy1 !== $original); // 输出:true var_dump($copy2 !== $original); // 输出:true var_dump($copy3 !== $original); // 输出:true
로그인 후 복사

在上面的示例中,我们创建了一个包含嵌套数组的原始数组。然后,我们使用array_merge_recursive(),json_encode()/json_decode()clone创建了三个深度副本。最后,我们使用var_dump()验证副本与原始数组是否不同,结果为truerrreee

장점:
  • 간단하고 사용하기 쉽습니다.
  • 중첩 배열을 재귀적으로 병합합니다.
단점:
  • 다른 방법보다 느립니다.
  • 배열이 너무 중첩되면 스택 오버플로 오류가 발생할 수 있습니다.
방법 2: json_encode() 및 json_decode() json_encode()이 함수는 PHP 변수를 JSON 문자열, json_decode()로 변환합니다.함수는 JSON 문자열을 PHP 변수로 변환합니다. 이러한 함수를 사용하여 배열의 전체 복사본을 만들 수 있습니다. rrreee장점:
  • array_merge_recursive()에 비해 속도가 더 빠릅니다.
  • 모든 유형의 배열을 처리합니다.
단점:
  • 대규모 배열의 경우 많은 메모리가 소모될 수 있습니다.
방법 3: clone사용객체 복제는 원본 배열과 완전히 독립적인 복사본을 생성하므로 배열에서도 작동합니다. rrreee장점:
  • 가장 빠른 딥 카피 방법.
  • 원본 배열과의 연결을 끊고 실제 복사본을 만듭니다.
단점:
  • 객체(배열 포함)에만 사용할 수 있습니다.
실용 사례다음은 PHP에서 배열의 전체 복사를 사용하는 방법을 보여주는 실제 사례입니다. rrreee위의 예에서는 중첩 배열을 포함하는 기본 요소를 생성합니다. 정렬. 그런 다음 array_merge_recursive(), json_encode()/json_decode()clone을 사용하여 3개의 딥 복사본을 생성했습니다. 마지막으로 var_dump()를 사용하여 복사본이 원본 배열과 다른지 확인하고 결과는 true입니다. 이는 복사본이 원본 배열의 독립적인 인스턴스임을 나타냅니다. .

위 내용은 PHP 배열 깊은 복사에 대한 다양한 접근 방식 살펴보기: 성능, 장단점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!