Chcę wiedzieć, jak do array_intersect dla tablicy obiektów.tablica przecina dla obiektu tablica php
Odpowiedz
array_intersect()
zwraca tablicę zawierającą wszystkie wartości tablicy 1, które występują we wszystkich argumentach.
Więc co znaczy występuje w tym kontekście (exacly ta funkcja), znalazłem na php.net Moja odpowiedź:
Wtedy nie można używać go na tablicy obiekty, jeśli obiekty nie implementują unikatowej konwersji na ciąg.
To niedorzeczne. Istnieją co najmniej trzy sposoby przekształcania obiektów w ciąg znaków. Mogą to być klasy PHP i implementować __toString, mogą mieć obsadę obsługującą obsadę, która akceptuje IS_STRING i mogą mieć procedurę obsługi, która zwraca zval, który jest konwertowalny na ciąg znaków. – Artefacto
+1 @Artefakto, prześlij odpowiedź z przykładem za pomocą dowolnych obiektów i array_intersect(). – Dolph
Jeśli twoje obiekty nie implementują unikatowej konwersji na łańcuch. – Svisstack
Poprawnym sposobem sprawdzenia, czy dwa obiekty są równe, jest użycie ==
. Dlatego:
array_uintersect($arr1, $arr2, function ($a1, $a2) { return $a1 == $a2; });
to nie działa. Masz inne kodowanie? –
Musisz być bardziej szczegółowy. Co nie działa? Czy są jakieś komunikaty o błędach? Jakie komunikaty o błędach? Wynik nie jest oczekiwany? Czego oczekiwano? Co dostałeś? – Artefacto
To nie działa, ponieważ array_unintersect potrzebuje funkcji porównania, aby zwrócić 1, -1 lub 0. Zobacz tutaj pełne wyjaśnienie i przykład http://php.net/manual/en/function.array-uintersect. php # 72841 – Tim
ładny toString funkcja jest już wdrożony i jest nazywany serialize;) tak
array_map(
'unserialize',
array_intersect(
array_map(
'serialize',
$obj1
),
array_map(
'serialize',
$obj2
)
)
);
zrobi pracę przykład wspomniano wyżej nie działa bo array_intersect praca tylko z łańcuchami jak ktoś wspomniałem także
Miałem podobny problem kilka dni temu, podczas gdy te są odpowiedzi na właściwej ścieżce; Kiedyś je wypracować następujące:
Od odpowiedzi Artefacto za return $obj1 == $obj2
tak naprawdę nie działała, więc napisałem prostą funkcję porównawczą (w zasadzie dostaje MD5 odcinkach obiektu i porównuje to):
function object_compare($obj1, $obj2){
$md5 = function($obj){
return md5(serialize($obj));
};
return strcmp($md5($obj1), $md5($obj2));
}
Wtedy to jut kwestia nazywając array_uintersect z naszej funkcji porównawczej dostać przecięciach:
# $array1/$array2 are the array of objects we want to compare
return array_uintersect($array1, $array2, 'object_compare');
W moim przypadku, miałem nieznany/dynamiczną tablicę obiektów, więc wziąłem go o krok dalej, więc don” t muszą zadeklarować array_uintersect($array1, $array2, ...)
specjalnie - ale po prostu być w stanie przejść w tablicy tablic (obiektów):
# $multiarray_of_objects is our array of arrays
$multiarray_of_objects[] = 'object_compare';
return call_user_func_array('array_uintersect', $multiarray_of_objects);
prostu musisz pamiętać, aby przekazać w odniesieniu do naszej zwrotnego funkcja/porównawcza jako ostatni ciąg w tablicy. Działa jak marzenie!
Z powodu pracy w klasie kontrolera, nie mogłem tego zrobić tak, ale używanie twojego podejścia z formatem Artefacto działało jak czar. – Magnanimity
W klasie 'return array_uintersect ($ array1, $ array2, 'self :: object_compare');' powinno działać, lub nawet 'ClassName :: object_compare', ale pamiętaj, że musi to być funkcja klasy publicznej. – Atari
Używam array_udiff do wdrożenia array_intersect dla object array.
function diff($a, $b) {
if($a === $b) {
return 0;
} else {
return 1;}
}
$array_1 = array('a', 'b', 'c');
$array_2 = array('c', 'd','e');
$array = array_udiff($array_1, array_udiff($array_1, $array_2, 'diff'),'diff');
var_dump($array);
return array(1) { [2]=> string(1) "c" }
Możesz mieć własną funkcję diff dla dowolnego schematu.
można używać w połączeniu z array_uintersect spl_object_hash patrz przykład:
array_uintersect($a, $b, function($a, $b) {
return strcmp(spl_object_hash($a), spl_object_hash($b));
});
gdzie „$ a” i „$ b” są tablice niektórych obiektów, które chcesz przecinają.
Ładne rozwiązanie. Dla współczesnych czytelników: w php7, 'strcmp()' można zastąpić operatorem '<=>', takim jak to: 'return spl_object_hash ($ a) <=> spl_object_hash ($ b);' –
Prawidłowe rozwiązanie byłoby:
array_uintersect($arr1, $arr2, function ($a1, $a2) { return $a1 != $a2; });
Zanotuj = w funkcji wywołania zwrotnego, w przeciwieństwie do odpowiedzi z @Artefacto!. Na podstawie dokumentacji array_uintersect
funkcja wywołania zwrotnego musi zwrócić wartość 0 (fałsz), jeśli elementy tablicy są równe.
To jest niepotrzebny typ hackowania, funkcja zwrotna powinna zwracać liczbę całkowitą (-1, 0, 1), jeśli pierwsza wartość jest mniejsza, równa lub większa od drugiej, podobnie jak w przypadku funkcji sortowania. Niejawny typecast wartości false wynoszący 0 zmyli czytelników twojego kodu. – amik
Tylko dla kompletności: Zaimplementuj metodę __toString()
w obiekcie zwracając unikalną wartość. W przypadku jednostek bazy danych może to być tak proste, jak zwrócenie pełnej nazwy klasy, która została dodana z identyfikatorem rekordu. Ale może być też dowolnie skomplikowana, wykonując haszowanie lub nawet gorsze rzeczy.
Moim zdaniem obowiązkiem klasy jest serializacja lub stworzenie czegoś wyjątkowego, aby porównać obiekty. Używanie czegokolwiek poza klasą do serializowania obiektu może spowodować dziwne zachowanie (w tym porównywanie obiektów różnych klas, które nigdy nie powinny prowadzić do równości).
- 1. Wielowymiarowa tablica asocjacyjna (PHP)
- 2. php json_encode duża tablica
- 3. Tablica filtrów PHP
- 4. PHP - pusta tablica
- 5. Tablica obiektów PHP
- 6. Tablica HTML do zestawu php
- 7. Obiekt działający jak tablica? (PHP)
- 8. php wielowymiarowa tablica uzyskać wartości
- 9. Tablica zleceń PHP według podzbioru
- 10. Tablica PHP jako klucz tablicy
- 11. Tablica dynamicznego wyboru w PHP
- 12. PHP: tablica obiektów - serialize vs json_encode - alternatywy?
- 13. Tablica PHP z domyślną wartością dla nieistniejących indeksów
- 14. Tablica logiczna a tablica numeryczna w MATLAB
- 15. Jak powinna wyglądać tablica rspec? kolejna tablica
- 16. Tablica JavaScript nie jest dostępna jako tablica
- 17. NumPy "tablica rekordów" lub "tablica strukturalna" lub "rekaracja"
- 18. PHP podwójna tablica sortowania na podstawie podłańcucha
- 19. Podpowiedź typu PHP: obsługiwana tablica, obiekt NIE?
- 20. Powiązana tablica w Delphi, tablica z kluczem łańcuchowym jest możliwa?
- 21. PHP Tablica stdClass, Jak zdobyć dane?
- 22. PHP sort tablica stdClass Objects przez id
- 23. zawijana w nawiasy w PHP (tablica)
- 24. Tablica PHP-Sort na podstawie innej tablicy?
- 25. php array_search pojedyncza tablica z wieloma trafieniami
- 26. Tablica PHP - Przekształcanie wartości tablic na klucze
- 27. Nieco prosta tablica PHP skrzyżowanie pytanie
- 28. Tablica dostępu zwrócona przez funkcję w php
- 29. PHP/SQL: ORDER BY lub sort ($ tablica)?
- 30. Tablica wielowymiarowa sortowania PHP według daty
Co masz na myśli przez "tablicę obiektów" - masz na myśli szereg obiektów? – thetaiko
tak, to jest tablica obiektów. –