วิธีเชื่อมต่ออาร์เรย์ตั้งแต่สองตัวขึ้นไปใน PHP โดยไม่สูญเสียค่าหากเป็นคีย์เดียวกันและค่าต่างกัน

ฉันมีอาร์เรย์หลายมิติสองตัว ฉันต้องเชื่อมต่อทั้งสองเข้าด้วยกันโดยไม่สูญเสียค่าใด ๆ ที่มีคีย์เดียวกันและค่าต่างกัน นี่คือสถานการณ์:

Array1
(
    [0] => 11
    [2] => 12
    [3] => 13
    [4] => (
                [0] =>  100
                [1] =>  200
            )
    [5] => 2
    [6] => 3
)

Array2
(
    [0] => 11
    [2] => 12
    [3] => 13
    [4] => (
                [0] =>  400
                [1] =>  500
            )
    [5] => 2
    [6] => 3
)

ผลลัพธ์ควรจะเป็น

Result
(
    [0] => 11
    [2] => 12
    [3] => 13
    [4] => (
                [0] =>  (
                            [0] => 100
                            [1] => 400
                        )
                [1] =>  (
                            [0] => 200
                            [1] => 500
                        )
            )
    [5] => 2
    [6] => 3
)

person s1lam8u    schedule 19.06.2015    source แหล่งที่มา
comment
แล้ว...คุณลองทำอะไรมาบ้างจนถึงตอนนี้?   -  person Federkun    schedule 19.06.2015
comment
comment
มันเป็นเพียง + โอเปอเรเตอร์และยังเป็นคำถามที่ซ้ำกัน))   -  person vitr    schedule 19.06.2015
comment
ความคิดเห็นทั้งสองไม่ถูกต้อง!   -  person codeneuss    schedule 19.06.2015
comment
ฉันได้ลองแล้ว หากฉันมีคีย์ & ค่าในอาร์เรย์ทั้งสอง ควรมีเพียงหนึ่งดัชนี ซึ่งอยู่ต่ำกว่ารหัสของฉัน $ar1 = array(color =› array(favorite =› red), 5); $ar2 = array(10, color =› array(favorite =› แดง, น้ำเงิน)); $result = array_merge_recursive($ar1, $ar2); เสียงสะท้อน ‹pre›; print_r($ผลลัพธ์); เสียงสะท้อน ‹/pre›   -  person s1lam8u    schedule 19.06.2015


คำตอบ (3)


นี่คือทางออกหนึ่ง:

<?php
$arrayA = array(0 => 11, 2 => 12, 3 => 13, 4 => array(0 => 100, 1 => array(0 => 222),), 5 => 2, 6 => 3);
$arrayB = array(
    0 => 11,
    2 => 12,
    3 => 13,
    4 => array(
        0 => 100,
        1 => array(0 => array(0 => 'test1', 1 => 'test2'), 1 => array(0 => 'test1', 1 => 'test2'),),
    ),
    5 => 2,
    6 => 3
);


/**
 * @param $a
 * @param $b
 * @return array
 */
function array_merge_graceful($a, $b)
{
    $c = [];
    if (is_array($a) && is_array($b)) {
        foreach (array_merge(array_keys($a),array_keys($b)) as $i) {
            if (!array_key_exists($i, $a)) {
                $c[$i] = $b[$i];
            } elseif (!array_key_exists($i, $b)) {
                $c[$i] = $a[$i];
            } else {
                $c[$i] = array_merge_graceful($a[$i], $b[$i]);
            }
        }
    } else {
        if ($a <> $b) {
            $c = [$a, $b];
        } else {
            $c = $a;
        }
    }
    return $c;
}

var_dump(array_merge_graceful($arrayA, $arrayB));

?>
person codeneuss    schedule 19.06.2015
comment
นี่กำลังตื่นอยู่... แต่สำหรับสถานการณ์นี้ใช้งานไม่ได้ โปรดช่วยฉันด้วย $array1 = อาร์เรย์( 0 =› 11, 2 =› 12, 3 =› 13, 4 =› อาร์เรย์ ( 0 =› 100, 1 =› อาร์เรย์ ( 0 =› 222 ), ), 5 =› 2, 6 = › 3 ); $array2 = อาร์เรย์( 0 =› 11, 2 =› 12, 3 =› 13, 4 =› อาร์เรย์ ( 0 =› 100, 1 =› อาร์เรย์ ( 0 =› อาร์เรย์ ( 0 =› 'test1', 1 =› 'test2' ), 1 =› อาร์เรย์ ( 0 =› 'test1', 1 =› 'test2' ), ), ), 5 =› 2, 6 =› 3 ); - person s1lam8u; 19.06.2015
comment
คุณคาดหวังผลอะไร? - person codeneuss; 19.06.2015
comment
ฉันมีการตอบสนองของ API ซึ่งให้ออบเจ็กต์จำนวนมากจากนั้น หลายออบเจ็กต์ที่มีคีย์เดียวกันและค่าต่างกันในบางครั้งคีย์และค่าเดียวกัน เลยต้องต่อกัน แต่ปัญหาคือ ไม่รู้ว่าจะได้ 2 มิติหรือ 3 มิติ บางครั้งฉันต้องรวม 3 อาร์เรย์เข้าด้วยกัน - person s1lam8u; 19.06.2015
comment
โอเค .. ฉันเข้าใจแล้ว .. ลองและบอกฉันว่ามันเหมาะกับคุณหรือไม่ - person codeneuss; 19.06.2015

ลองอะไรแบบนี้

<?php

$array1 = array(11, 12, 13, array(100, 200), 2, 3);
$array2 = array(11, 12, 13, array(400, 500), 2, 3);
echo "<pre>";
print_r($array1);
print_r($array2);

$combine = array();

foreach ($array1 as $key => $value) {
    if (array_key_exists($key, $combine)) {
        //if is array
        if (is_array($combine[$key])) {
            $combine[$key] = array($combine[$key], $value);
        }
    } else {
        $combine[$key] = $value;
    }
}

foreach ($array2 as $key => $value) {
    if (array_key_exists($key, $combine)) {
        //if is array
        if (is_array($combine[$key])) {
            $combine[$key] = array($combine[$key], $value);
        }
    } else {
        $combine[$key] = $value;
    }
}

echo "<hr>";
print_r($combine);
person Faiz Rasool    schedule 19.06.2015

ใช้ฟังก์ชัน array_merge_recursive() เพื่อรวมอาร์เรย์ สำหรับรายละเอียดเพิ่มเติม โปรดดูที่ http://php.net/manual/en/function.array-merge-recursive.php

person sonam gupta    schedule 19.06.2015
comment
หากฉันมีคีย์ & ค่าในทั้งสองอาร์เรย์ ควรมีเพียงหนึ่งดัชนี ซึ่งอยู่ต่ำกว่าโค้ดของฉัน $ar1 = array(color =› array(favorite =› red), 5); $ar2 = array(10, color =› array(favorite =› แดง, น้ำเงิน)); $result = array_merge_recursive($ar1, $ar2); เสียงสะท้อน ‹pre›; print_r($ผลลัพธ์); เสียงสะท้อน ‹/pre›; - person s1lam8u; 19.06.2015
comment
มันอาจใช้งานได้กับคีย์สตริง .. แต่ไม่ใช่กับคีย์จำนวนเต็ม ... ฉันได้ลองกับอาร์เรย์จากคำถามแล้ว ... มันไม่ใช่ rtfm เสมอไป - person codeneuss; 19.06.2015