PHP iki ilişkilendirilebilir diziyi tek bir dizide birleştirir


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

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

Hepsini bir araya getiren yeni bir diziye ihtiyacım var, yani

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

Bunu yapmanın en iyi yolu nedir?

Üzgünüm, unuttum, kimlikler birbiriyle asla eşleşmeyecek, ancak teknik olarak isimler olabilir, ancak yine de olası değildir ve hepsinin tek bir dizide listelenmesi gerekir. Array_merge'e baktım ama bunu yapmanın en iyi yolu olup olmadığından emin değildim. Ayrıca, bunu nasıl test edersiniz?


5
Görünüşe göre sadece array_merge'ı arıyorsunuz.
Corbin

Bence en iyi yol, anahtarların tümünün farklı olduğunu biliyorsanız, + = operatörünü kullanmaktır: $ dizi1 + = $ dizi2; Bu, $ dizi2'nin tüm öğelerini $ dizi1'in sonuna ekler.
David Spector

Yanıtlar:


130

array_merge() daha etkilidir, ancak birkaç seçenek vardır:

$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 işlevinin operatörü kullanmaya göre faydası nedir?
jsteinmann

38
Dizi Birleştirme (+): + operatörü, kalan anahtarların öğelerini sağ el dizisinden sol ele ekler, ancak çoğaltılan anahtarların üzerine YAZILMAZ. array_merge (): Giriş dizileri aynı dize anahtarlarına sahipse, bu anahtar için sonraki değer öncekinin üzerine yazılır. Bununla birlikte, diziler sayısal anahtarlar içeriyorsa, sonraki değer orijinal değerin üzerine yazılmaz, ancak eklenir. Tüm diziler yalnızca sayısal anahtarlar içeriyorsa, ortaya çıkan diziye sıfırdan başlayarak artan anahtarlar verilir.
Samuel Cook

13
Ayrıca array_merge, argümanlardan herhangi biri NULL ise, NULL döndürecektir.
SeanWM

4
Tamsayı anahtarları varsa, bunlar 0'dan BAŞLAYARAK tamsayı anahtarlarına değiştirilecektir. Array_merge konusunda çok dikkatli olun. Yapmaya çalıştığınız şeyi yapmak için bir foreach döngüsü kullansanız iyi olur.
user2850305

24

Kontrol edin array_merge().

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

22
@SudhanshuSaxena Bunu gönderen ilk kişi olduğumu düşünürsek, bunun nasıl tekrar eden bir cevap olabileceğini anlamıyorum.
Brad

10

array_replaceBir orijinal dizinin, yinelenen anahtarlar oluşturmadan anahtar => değer ilişkisini koruyarak diğer diziler tarafından değiştirildiği yer de vardır .

  • Diğer dizilerdeki aynı anahtarlar, değerlerin orijinal dizinin üzerine yazılmasına neden olur
  • Orijinal dizide diğer dizilerdeki yeni anahtarlar oluşturulacak

1
Bu doğru cevap. Dizi_merge, sayısal anahtarlarınız varsa çalışmayacaktır (tüm anahtarlar tutarlı dizinlere dönüştürülecektir).
Dmitry

3

SeanWM'nin boş diziler hakkındaki yorumuyla ilgilenmek için array_merge etrafında bir sarmalayıcı kullanıyorum; Ayrıca bazen kopyalardan kurtulmak istiyorum. Ayrıca yeni bir dizi oluşturmak yerine genellikle bir diziyi diğeriyle birleştirmek istiyorum. Bu şu şekilde biter:

/**
 * 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,
            ])
        );

Sayısal ise ancak sıralı ilişkisel dizi değilse, kullanmanız gerekir array_replace


0

İki assoc dizisini birleştirmenin temiz bir yolunu bulmaya çalışırken bu soruya rastladım.

Birbiriyle ilişkisi olmayan iki farklı masayı birleştirmeye çalışıyordum.

PDO Sorgusunun iki Tabloyu birleştirmesi için bulduğum şey buydu. Samuel Cook, array_merge()ona +1 ile benim için bir çözüm belirleyen şeydi .

        $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>';

Belki bu başka birine yardımcı olur.


0

GÜNCELLEME Hızlı bir not, görebildiğim gibi bu gerçekten aptalca görünüyor ve saf PHP ile iyi bir kullanımı yok çünkü array_mergesadece orada çalışıyor. ANCAK, olumsuz oy kullanmak için acele etmeden önce PHP MongoDB sürücüsüyle deneyin. O herif herhangi bir nedenle dizinler ekleyecek ve birleştirilen nesneyi mahvedecek. Benim saf küçük işlevimle, birleştirme tam olarak geleneksel bir şekilde olması gerektiği gibi çıkıyor array_merge.


Ben eski bir soru biliyorum ama MongoDB sürücü sorgular ve hiçbiri ile son zamanlarda vardı bir dava daha eklemek istiyorum array_merge, array_replacene de array_pushçalıştı. Dizide diziler olarak sarılmış nesnelerin biraz karmaşık yapısına sahiptim:

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

Ve aynı yapıyı koruyarak onları birleştirmem gerekiyordu:

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

Bulduğum en iyi çözüm şuydu:

public static function glueArrays($arr1, $arr2) {
    // merges TWO (2) arrays without adding indexing. 
    $myArr = $arr1;
    foreach ($arr2 as $arrayItem) {
        $myArr[] = $arrayItem;
    }
    return $myArr;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.