PHP는 어레이를 다른 어레이에 추가합니다(array_push 또는 +가 아님).
키를 비교하지 않고 어레이를 다른 어레이에 추가하는 방법
$a = array( 'a', 'b' );
$b = array( 'c', 'd' );
마지막은 다음과 같습니다.Array( [0]=>a [1]=>b [2]=>c [3]=>d )
이런 걸 쓰면[]
또는array_push
다음 중 하나의 결과가 발생합니다.
Array( [0]=>a [1]=>b [2]=>Array( [0]=>c [1]=>d ) )
//or
Array( [0]=>c [1]=>d )
이렇게 하는 것이 더 우아한 방법이어야 합니다.
foreach ( $b AS $var )
$a[] = $var;
array_merge
우아한 방법입니다.
$a = array('a', 'b');
$b = array('c', 'd');
$merge = array_merge($a, $b);
// $merge is now equals to array('a','b','c','d');
다음과 같은 작업을 수행합니다.
$merge = $a + $b;
// $merge now equals array('a','b')
동작하지 않습니다.+
연산자는 실제로 이들을 병합하지 않습니다.만약 그들이$a
와 같은 키를 가지고 있다.$b
아무 것도 안 될 거야
PHP 5.6+에서 이 작업을 수행하는 또 다른 방법은...
상품권
$a = array('a', 'b');
$b = array('c', 'd');
array_push($a, ...$b);
// $a is now equals to array('a','b','c','d');
이것은, 모든 네트워크와 함께 동작합니다.Traversable
$a = array('a', 'b');
$b = new ArrayIterator(array('c', 'd'));
array_push($a, ...$b);
// $a is now equals to array('a','b','c','d');
단, 경고:
- 7.3 이전 버전의 PHP에서는 다음과 같은 경우 치명적인 오류가 발생합니다.
$b
빈 배열이거나 통과할 수 없습니다(예: 배열). - PHP 7.3에서는 다음과 같은 경우 경고가 발생합니다.
$b
통과할 수 없습니다.
왜 사용하지 않는가?
$appended = array_merge($a,$b);
올바른 기본 제공 방법을 사용하지 않는 이유는 무엇입니까?
꽤 오래된 투고입니다만, 어레이를 다른 어레이에 추가하는 것에 대해 덧붙이고 싶습니다.
한다면
- 한쪽 또는 양쪽 어레이에 관련 키가 있습니다.
- 양쪽 어레이의 키는 중요하지 않다
어레이 기능을 다음과 같이 사용할 수 있습니다.
array_merge(array_values($array), array_values($appendArray));
array_merge는 숫자 키를 병합하지 않으므로 $appendArray의 모든 값을 추가합니다.foreach-loop 대신 네이티브 php 함수를 사용하는 동안 요소가 많은 어레이에서는 더 빠를 것입니다.
추가 2019-12-13: PHP 7.4 이후 Array Spread Operator 방식으로 어레이를 추가하거나 추가할 수 있습니다.
$a = [3, 4];
$b = [1, 2, ...$a];
이전과 마찬가지로 이 새로운 기능에서는 키가 문제가 될 수 있습니다.
$a = ['a' => 3, 'b' => 4];
$b = ['c' => 1, 'a' => 2, ...$a];
"치명적 오류:검출되지 않은 오류: 문자열 키로 어레이를 언팩할 수 없습니다."
$a = [3 => 3, 4 => 4];
$b = [1 => 1, 4 => 2, ...$a];
array(4) { [1]=> int(1) [4]=> int(2) [5]=> int(3) [6]=> int(4) }
$a = [1 => 1, 2 => 2];
$b = [...$a, 3 => 3, 1 => 4];
array(3) { [0]=> int(1) [1]=> int(4) [3]=> int(3) }
<?php
// Example 1 [Merging associative arrays. When two or more arrays have same key
// then the last array key value overrides the others one]
$array1 = array("a" => "JAVA", "b" => "ASP");
$array2 = array("c" => "C", "b" => "PHP");
echo " <br> Example 1 Output: <br>";
print_r(array_merge($array1,$array2));
// Example 2 [When you want to merge arrays having integer keys and
//want to reset integer keys to start from 0 then use array_merge() function]
$array3 =array(5 => "CSS",6 => "CSS3");
$array4 =array(8 => "JAVASCRIPT",9 => "HTML");
echo " <br> Example 2 Output: <br>";
print_r(array_merge($array3,$array4));
// Example 3 [When you want to merge arrays having integer keys and
// want to retain integer keys as it is then use PLUS (+) operator to merge arrays]
$array5 =array(5 => "CSS",6 => "CSS3");
$array6 =array(8 => "JAVASCRIPT",9 => "HTML");
echo " <br> Example 3 Output: <br>";
print_r($array5+$array6);
// Example 4 [When single array pass to array_merge having integer keys
// then the array return by array_merge have integer keys starting from 0]
$array7 =array(3 => "CSS",4 => "CSS3");
echo " <br> Example 4 Output: <br>";
print_r(array_merge($array7));
?>
출력:
Example 1 Output:
Array
(
[a] => JAVA
[b] => PHP
[c] => C
)
Example 2 Output:
Array
(
[0] => CSS
[1] => CSS3
[2] => JAVASCRIPT
[3] => HTML
)
Example 3 Output:
Array
(
[5] => CSS
[6] => CSS3
[8] => JAVASCRIPT
[9] => HTML
)
Example 4 Output:
Array
(
[0] => CSS
[1] => CSS3
)
bstoney와 Snark의 답변에 이어 다양한 방법을 테스트했습니다.
// Test 1 (array_merge)
$array1 = $array2 = array_fill(0, 50000, 'aa');
$start = microtime(true);
$array1 = array_merge($array1, $array2);
printf("Test 1: %.06f\n", microtime(true) - $start);
// Test2 (foreach)
$array1 = $array2 = array_fill(0, 50000, 'aa');
$start = microtime(true);
foreach ($array2 as $v) {
$array1[] = $v;
}
printf("Test 2: %.06f\n", microtime(true) - $start);
// Test 3 (... token)
// PHP 5.6+ and produces error if $array2 is empty
$array1 = $array2 = array_fill(0, 50000, 'aa');
$start = microtime(true);
array_push($array1, ...$array2);
printf("Test 3: %.06f\n", microtime(true) - $start);
그 결과:
Test 1: 0.002717
Test 2: 0.006922
Test 3: 0.004744
원본: PHP 7에서는 방법 3이 훨씬 더 나은 대안이라고 생각합니다. 왜냐하면 현재 foreach 루프가 작동하는 방식이기 때문입니다. 즉, 반복되는 어레이의 복사본을 만드는 방식이기 때문입니다.
방법 3은 질문의 "array_push가 아니다"라는 기준에 대한 답변은 아니지만, 한 줄이며 모든 면에서 가장 높은 성능을 발휘합니다. 그러나 이 질문은 ... 구문이 선택되기 전에 질문되었다고 생각합니다.
업데이트 25/03/20: 변수가 리셋되지 않아 결함이 있었던 테스트를 업데이트했습니다.흥미롭게도(또는 혼란스럽게) 결과는 테스트 1이 가장 빠르고 가장 느린 0.008392에서 0.002717로 변경되었습니다.이는 테스트 결함의 영향을 받지 않기 때문에 PHP 업데이트에만 의존할 수 있습니다.
그래서 사가는 계속되기 때문에 앞으로는 array_merge를 사용할 거예요!
대용량 어레이의 경우 메모리 복사를 피하기 위해 array_merge 없이 연결하는 것이 좋습니다.
$array1 = array_fill(0,50000,'aa');
$array2 = array_fill(0,100,'bb');
// Test 1 (array_merge)
$start = microtime(true);
$r1 = array_merge($array1, $array2);
echo sprintf("Test 1: %.06f\n", microtime(true) - $start);
// Test2 (avoid copy)
$start = microtime(true);
foreach ($array2 as $v) {
$array1[] = $v;
}
echo sprintf("Test 2: %.06f\n", microtime(true) - $start);
// Test 1: 0.004963
// Test 2: 0.000038
PHP 7.4를 사용할 수 있습니다. 오퍼레이터.이것은 Ruby를 포함한 다른 언어에서는 splat 연산자로도 알려져 있습니다.
$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
var_dump($fruits);
산출량
array(5) {
[0]=>
string(6) "banana"
[1]=>
string(6) "orange"
[2]=>
string(5) "apple"
[3]=>
string(4) "pear"
[4]=>
string(10) "watermelon"
}
splat 연산자는 array_merge보다 성능이 우수해야 합니다.이는 splat 연산자가 언어 구조인 반면 array_merge는 함수이기 때문일 뿐만 아니라 컴파일 시간 최적화가 일정한 배열에 대해 수행될 수 있기 때문입니다.
또한 표준 요소를 스플래트 연산자 앞 또는 뒤에 추가할 수 있으므로 배열 내 어디에서나 스플래트 연산자 구문을 사용할 수 있습니다.
$arr1 = [1, 2, 3];
$arr2 = [4, 5, 6];
$arr3 = [...$arr1, ...$arr2];
$arr4 = [...$arr1, ...$arr3, 7, 8, 9];
PHP7 이전에는 다음을 사용할 수 있습니다.
array_splice($a, count($a), 0, $b);
array_splice()
는 배열(1번째 인수)을 기준으로 동작하며 두 번째 인수 및 세 번째 인수 번호에서 시작된 값 목록 대신 배열(4번째 인수) 값을 배치합니다.끝, 세 하면 첫 에는 네 됩니다.
빈 배열을 기존 새 값과 병합할 경우.먼저 초기화해야 합니다.
$products = array();
//just example
for($brand_id=1;$brand_id<=3;$brand_id++){
array_merge($products,getByBrand($brand_id));
}
// it will create empty array
print_r($a);
//check if array of products is empty
for($brand_id=1;$brand_id<=3;$brand_id++){
if(empty($products)){
$products = getByBrand($brand_id);
}else{
array_merge($products,getByBrand($brand_id));
}
}
// it will create array of products
도움이 됐으면 좋겠다.
기존 어레이에 값을 추가하는 데 foreach 루프가 array_displays보다 빠르기 때문에 어레이를 다른 어레이 끝에 추가하려면 루프를 대신 선택하십시오.
// Create an array of arrays
$chars = [];
for ($i = 0; $i < 15000; $i++) {
$chars[] = array_fill(0, 10, 'a');
}
// test array_merge
$new = [];
$start = microtime(TRUE);
foreach ($chars as $splitArray) {
$new = array_merge($new, $splitArray);
}
echo microtime(true) - $start; // => 14.61776 sec
// test foreach
$new = [];
$start = microtime(TRUE);
foreach ($chars as $splitArray) {
foreach ($splitArray as $value) {
$new[] = $value;
}
}
echo microtime(true) - $start; // => 0.00900101 sec
// ==> 1600 times faster
언급URL : https://stackoverflow.com/questions/4268871/php-append-one-array-to-another-not-array-push-or
'programing' 카테고리의 다른 글
고급 PHP 개발자를 위한 MVC (0) | 2022.12.19 |
---|---|
도커가 MariaDB 비밀번호를 설정하지 않음 (0) | 2022.12.19 |
MariaDB 10.3 데이터베이스 서버를 시작하지 못했습니다. (0) | 2022.12.19 |
C를 사용하여 어레이 반환 (0) | 2022.12.19 |
Angular JS: 이미 디렉티브의 스코프가 있는 컨트롤러가 있는데 디렉티브의 링크 함수가 필요한 것은 무엇입니까? (0) | 2022.12.19 |