Tüm durumlarda herhangi bir yinelenen girdileri üzerine yok böyle php 2 ilişkilendirilebilir dizi birleştirmek nasıl?

2 Cevap php

Ben aynı birçok içerik var iki birleştirici bir dizi var ve bu yüzden böyle bir şekilde bu iki diziyi birleştirmek istiyorum ben daha a dizide 1 ve a dizide 2 varsa dizisi 3. ben de a's olup 1 için kayıtlar olmalıdır.

Ben array_merge kullanarak denedim ama 2 dizide tüm çoğaltmaları varsa o 1 dizide girişlerin üzerine olurdu, ben o zaman ben de + kullanarak denedim ama Fatal error: Unsupported operand types in /home/code.php söyleyerek bana ölümcül hata veriyor yaparak çalıştı

(array)$ar3 = (array)$ar1 +(array)$ar2 ve o kadar eklemek gibi görünüyor. Bilmek istiyorum da bunu yapmak için doğru yolu nedir ve neden ben ölümcül hata var ve başlangıçta yaptım ben zaten dizi türleri olarak $ ar3, $ ar2, $ ar1 tanımlanmış olduğu gibi çalıştı daha.

$orders = new Order(); 
$prospectOffers = $orders->getOrder($orderConfNumber); 
$prospectOffersResult = json_decode($prospectOffers,true); 
$shoppingBasket = $cart->getCartItems(); 
var_dump($prospectOffersResult); // Both are arrays 
var_dump($shoppingBasket); //Both are arrays 
(array)$result = (array)$prospectOffersResult+(array)$shoppingBasket;

Teşekkürler.

2 Cevap

$array1 + $array2 iki dizilerin birliği dönecektir. Onlar ilişkisel iseniz tuşları çakışıyorsa, sol İşlenenden değerler tercih edilecektir. Bu nedenle, bu değerler kaybolur gibi istediğiniz çözüm değildir.

Her iki değişken diziler olarak anlaşılmaktadır sağlanan deyimi ile yanlış bir şey yok. Bir değişken aslında bir nesne oldu, ve o kullanarak var_dump hata mümkündür çünkü ölümcül hata olasılığı oluştu. Türünü ekleyerek diziler hem değişkenleri zorlamak için PHP zorla atmalarını. Bir değişken bir nesne ise, bu etkiye sahip olacaktır:

PHP.net Manual Gönderen

"If an object is converted to an array, the result is an array whose elements are the object's properties. The keys are the member variable names, with a few notable exceptions: integer properties are unaccessible; private variables have the class name prepended to the variable name; protected variables have a '*' prepended to the variable name. These prepended values have null bytes on either side."

Şimdi eklemek için iki diziyi sahip, PHP hakkında panik bir şey vardı. + önemli iki işlenen döküm yaparken, bu atama edildi değişkeni artığını anlamsız olduğunu unutmayın. Ifadesi (array)$foo $ foo değiştirmek değil, yeni bir değer döndürür. Bu değişkenleri bildirmek için gerektirir dillerden sezgisel olmayabilir, ancak PHP böyle bir dil değildir.

Diğer konuda, bir dizide aynı tuşa iki tane olamaz. Bu imkansız dönmek için doğru değer olarak dizi belirsiz olacak indeks yapmak istiyorum. Eğer bir kayıpsız malikâne iki diziyi birleştirmek istiyorsanız, daha karmaşık bir veri yapısını kullanmak zorunda olacak.

Benim önerim diziler bir dizi, nerede kullanmak için:

$a1 = array('a' => 1, 'b' => 2, 'c' => 3);
$a2 = array('a' => 3, 'b' => 2, 'd' => 2);

Olacak:

$a3 = array(
    'a' => array(1, 3),
    'b' => array(2, 2),
    'c' => array(3),
    'd' => array(2)
);

Ve sipariş belirlenmiş değildir. Yapısına tek önemli değişiklik, tüm birinci değerler benzer şifreler değerleri birikmiş izin vererek, dizi olmasıdır. Bu fonksiyon görevi yapar ve daha iyi bir isim yapmak olabilir:

// array(array) lossless_array_merge([$array1 [, $array2 [, $...]]])

function lossless_array_merge() {
  $arrays = func_get_args();
  $data = array();
  foreach ($arrays as $a) {
    foreach ($a as $k => $v) {
      $data[$k][] = $v;
    }
  }
  return $data;
}

array_merge() çiftleri geçersiz olacak sadece iki dizide contain the same string keys:

If the input arrays have the same string keys, then the later value for that key will overwrite the previous one. If, however, the arrays contain numeric keys, the later value will not overwrite the original value, but will be appended.

Bu beklenen bir davranıştır inanıyorum. Nasıl you Bu durumda işlemek istiyorsunuz? Diyelim ki

$arr1 = array('a' => 1);
$arr2 = array('a' => 2);

Dizi birleştirme sonra ne kabul edilebilir bir çıkış olurdu?