PHP는 두 개의 연관 배열을 하나의 배열로 결합합니다.


85
$array1 = array("$name1" => "$id1");

$array2 = array("$name2" => "$id2", "$name3" => "$id3");

모두 함께 결합 된 새 어레이가 필요합니다. 즉,

$array3 = array("$name1" => "$id1", "$name2" => "$id2", "$name3" => "$id3");

이를 수행하는 가장 좋은 방법은 무엇입니까?

죄송합니다. ID는 서로 일치하지 않지만 기술적으로는 이름이 일치 할 수는 있지만 가능성이 없으며 모두 하나의 배열에 나열되어야합니다. array_merge를 보았지만 이것이 최선의 방법인지 확실하지 않았습니다. 또한 이것을 어떻게 단위 테스트할까요?


5
아마도 array_merge를 찾고있는 것 같습니다.
Corbin

키가 모두 다르다는 것을 알고 있다면 가장 좋은 방법은 + = 연산자를 사용하는 것입니다. $ array1 + = $ array2; 이렇게하면 $ array2의 모든 요소가 $ array1 끝에 추가됩니다.
David Spector 2018

답변:


127

array_merge() 더 효율적이지만 몇 가지 옵션이 있습니다.

$array1 = array("id1" => "value1");

$array2 = array("id2" => "value2", "id3" => "value3", "id4" => "value4");

$array3 = array_merge($array1, $array2/*, $arrayN, $arrayN*/);
$array4 = $array1 + $array2;

echo '<pre>';
var_dump($array3);
var_dump($array4);
echo '</pre>';


// Results:
    array(4) {
      ["id1"]=>
      string(6) "value1"
      ["id2"]=>
      string(6) "value2"
      ["id3"]=>
      string(6) "value3"
      ["id4"]=>
      string(6) "value4"
    }
    array(4) {
      ["id1"]=>
      string(6) "value1"
      ["id2"]=>
      string(6) "value2"
      ["id3"]=>
      string(6) "value3"
      ["id4"]=>
      string(6) "value4"
    }

7
연산자를 사용하는 것보다 array_merge의 이점은 무엇입니까?
jsteinmann

37
배열 결합 (+) : + 연산자는 오른쪽 배열의 나머지 키 요소를 왼손 배열에 추가하는 반면 중복 된 키는 덮어 쓰지 않습니다. array_merge () : 입력 배열에 동일한 문자열 키가 있으면 해당 키의 이후 값이 이전 키를 덮어 씁니다. 그러나 배열에 숫자 키가 포함 된 경우 나중 값이 원래 값을 덮어 쓰지 않고 추가됩니다. 모든 배열에 숫자 키만 포함 된 경우 결과 배열에는 0부터 시작하는 증가 키가 제공됩니다.
사무엘 쿡

12
또한 array_merge인수가 NULL이면 NULL을 반환 한다는 점에 유의해야 합니다.
SeanWM

4
정수 키가 있으면 0부터 시작하는 정수 키로 변경됩니다. array_merge에주의하십시오. foreach 루프를 사용하여 수행하려는 작업을 수행하는 것이 좋습니다.
user2850305

24

확인하십시오 array_merge().

$array3 = array_merge($array1, $array2);

22
@SudhanshuSaxena 내가 처음 게시 한 사람이라는 점을 고려할 때 어떻게 반복적 인 답변이 될 수 있는지 모르겠습니다.
Brad

10

또한 중복 키를 생성하지 않고 키 => 값 연결을 array_replace유지하는 다른 배열에 의해 원래 배열이 수정되는 경우도 있습니다 .

  • 다른 배열의 동일한 키로 인해 값이 원래 배열을 덮어 씁니다.
  • 다른 어레이의 새 키가 원래 어레이에 생성됩니다.

1
이것이 정답입니다. array_merge는 숫자 키가있는 경우 작동하지 않습니다 (모든 키가 일관된 인덱스로 변환 됨).
Dmitry

3

null 배열에 대한 SeanWM의 설명을 처리하기 위해 array_merge 주위에 래퍼를 사용합니다. 나는 또한 때때로 중복을 제거하고 싶습니다. 또한 일반적으로 새 배열을 만드는 대신 하나의 배열을 다른 배열로 병합하고 싶습니다. 이것은 다음과 같이 끝납니다.

/**
 * Merge two arrays - but if one is blank or not an array, return the other.
 * @param $a array First array, into which the second array will be merged
 * @param $b array Second array, with the data to be merged
 * @param $unique boolean If true, remove duplicate values before returning
 */
function arrayMerge(&$a, $b, $unique = false) {
    if (empty($b)) {
        return;  // No changes to be made to $a
    }
    if (empty($a)) {
        $a = $b;
        return;
    }
    $a = array_merge($a, $b);
    if ($unique) {
        $a = array_unique($a);
    }
}

2
        $array = array(
            22 => true,
            25 => true,
            34 => true,
            35 => true,
        );

        print_r(
            array_replace($array, [
                22 => true,
                42 => true,
            ])
        );

        print_r(
            array_merge($array, [
                22 => true,
                42 => true,
            ])
        );

숫자이지만 순차적 인 연관 배열이 아닌 경우 다음을 사용해야합니다. array_replace


0

나는 두 개의 assoc 배열을 결합하는 깨끗한 방법을 식별하려고 시도하는이 질문을 우연히 발견했습니다.

나는 서로 관계가없는 두 개의 다른 테이블을 조인하려고했습니다.

이것이 두 테이블을 결합하는 PDO 쿼리에 대해 생각해 낸 것입니다. Samuel Cook은 array_merge()그에게 +1로 나를위한 해결책을 확인 했습니다.

        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $sql = "SELECT * FROM ".databaseTbl_Residential_Prospects."";
        $ResidentialData = $pdo->prepare($sql);
        $ResidentialData->execute(array($lapi));
        $ResidentialProspects = $ResidentialData->fetchAll(PDO::FETCH_ASSOC);

        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $sql = "SELECT * FROM ".databaseTbl_Commercial_Prospects."";
        $CommercialData = $pdo->prepare($sql);
        $CommercialData->execute(array($lapi));
        $CommercialProspects = $CommercialData->fetchAll(PDO::FETCH_ASSOC);

        $Prospects = array_merge($ResidentialProspects,$CommercialProspects);
        echo '<pre>';
        var_dump($Prospects);
        echo '</pre>';

아마도 이것은 다른 사람을 도울 것입니다.


0

UPDATE 내가 볼 수 있듯이 이것은 정말 어리석은 것처럼 보이며 순수한 PHP에서는 잘 사용되지 않습니다 array_merge. 그러나 당신이 서두르 기 전에 PHP MongoDB 드라이버로 시도하십시오. 그 친구는 어떤 이유로 든 색인을 추가하고 병합 된 개체를 망칠 것입니다. 내 순진한 작은 기능으로 병합은 기존의 array_merge.


나는 오래된 질문 알고 있지만 나는 MongoDB의 드라이버 쿼리와의 없음과 함께 최근 한 또 하나의 경우 추가하려면 array_merge, array_replacearray_push일을. 배열의 배열로 래핑 된 개체의 약간 복잡한 구조가 있습니다.

$a = [
 ["a" => [1, "a2"]],
 ["b" => ["b1", 2]]
];
$t = [
 ["c" => ["c1", "c2"]],
 ["b" => ["b1", 2]]
];

그리고 나는 다음과 같은 구조를 유지하면서 그것들을 병합해야했습니다.

$merged = [
 ["a" => [1, "a2"]],
 ["b" => ["b1", 2]],
 ["c" => ["c1", "c2"]],
 ["b" => ["b1", 2]]
];

내가 생각 해낸 최고의 솔루션은 다음과 같습니다.

public static function glueArrays($arr1, $arr2) {
    // merges TWO (2) arrays without adding indexing. 
    $myArr = $arr1;
    foreach ($arr2 as $arrayItem) {
        $myArr[] = $arrayItem;
    }
    return $myArr;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.