dizi nesne dizi php için kesişir

4 Cevap php

Ben nesne dizisi için array_intersect nasıl bilmek istiyorum.

4 Cevap

güzel toString işlevi zaten uygulanan ve serialize denir ;) böylece

array_map('unserialize', array_intersect(array_map('serialize', $obj1), array_map('serialize', $obj2)) );

Birisi de belirtildiği gibi çalışma tek dizeleri ile Array_Intersect 'neden çalışmıyor yüksek belirtilen çalışma, örnek yapacak

Iki nesne eşit olup olmadığını kontrol etmek için doğru şekilde kullanmaktır ==. Bu yüzden:

array_uintersect($arr1, $arr2, function ($a1, $a2) { return $a1 == $a2; });

array_intersect() tüm argümanlar mevcut tüm dizi1 değerlerini içeren bir dizi döndürür.

Sonra bu bağlamda (exacly bu fonksiyonu) mevcut ne demek, ben php.net cevabım bulundu:

Two elements are considered equal if and only if (string) $elem1 === (string) $elem2. In words: when the string representation is the same.

Then you can't use it on array of objects if your objects not implements unique conversion to string.

Bu cevaplar doğru yolda ise, bir kaç gün önce benzer bir sorun vardı; Ben şu çalışmak için kullanmıştır:

Artefacto cevabı dan return $obj1 == $obj2 gerçekten işe, bu yüzden basit bir karşılaştırma fonksiyonu (temelde serileştirilmiş nesne md5 alır ve karşılaştırır) yazdı etmedi:

function object_compare($obj1, $obj2){
  $md5 = function($obj){
    return md5(serialize($obj));
  };
  return strcmp($md5($obj1), $md5($obj2));
}

Sonra kavşak almak için karşılaştırmalı fonksiyonu ile array_uintersect çağıran bir madde çıkıntı oluyor:

# $array1 / $array2 are the array of objects we want to compare
return array_uintersect($array1, $array2, 'object_compare');

Benim durumumda, ben nesnelerin bilinmeyen / dinamik dizi vardı, bu yüzden ben bu yüzden ben özellikle array_uintersect($array1, $array2, ...) bildirmek zorunda değilsiniz bunu bir adım ileri götürdü - (ama sadece diziler bir dizi geçmek mümkün Nesnelerin):

# $multiarray_of_objects is our array of arrays
$multiarray_of_objects[] = 'object_compare';
return call_user_func_array('array_uintersect', $multiarray_of_objects);

Sadece lazım dizideki son dizesi olarak geri arama / karşılaştırmalı işlevi referans geçmek hatırlıyorum. Bir cazibe gibi çalışır!