Czytam dane JSON z PHP i dane zawierają puste obiekty (np. {}
). Problem polega na tym, że mam do czynienia z przypadkiem, gdy obiekt jest pusty w inny sposób, ale nie mogę znaleźć wystarczająco dobrego sposobu na sprawdzenie. empty(get_object_vars(object))
wygląda zbyt przerażająco i bardzo nieefektywnie. Czy istnieje dobry sposób na sprawdzenie?Jak sprawdzić, czy obiekt JSON jest pusty w PHP?
Odpowiedz
Ile obiektów Chyba że empty(get_object_vars($object))
lub odlewanie do tablicy okaże się poważnym spowolnieniem/wąskim gardłem, nie martwię się o to - rozwiązanie Grega jest po prostu w porządku
Sugeruję użyciu flagi $associative
podczas dekodowania danych JSON, ale:
json_decode($data, true)
Ten dekoduje obiekty JSON jako zwykły starych tablic PHP zamiast jak stdClass
obiektów. Następnie możesz sprawdzić puste obiekty używając empty()
i tworzyć obiekty klasy zdefiniowanej przez użytkownika, zamiast używać stdClass
, co jest prawdopodobnie dobrym pomysłem na dłuższą metę.
Można rzucić go do tablicy (niestety nie można tego zrobić w terminie wezwania do empty()
:
$x = (array)$obj;
if (empty($x))
...
lub odlewane do tablicy i count()
:
if (count((array)$obj))
...
Czy to nie to samo co z get_object_vars? To znaczy. nie jest naprawdę skuteczny? :) – vava
Nie testowałem tego, ale jeśli nie masz problemów z wydajnością i uznałeś to za wąskie gardło, nie sądzę, że warto się nim martwić. – Greg
Nie jest łatwo przestać martwić się niepotrzebnymi przekształceniami macierzy, jeśli przez większość życia byłeś programistą C++ :) Oznacza to przydzielanie pamięci i kopiowanie rzeczy na coś, co powinno zająć tylko szybkie sprawdzenie, czy bit jest ustawiony. – vava
Musiałem powiedzieć, czy obiekt był pusty, czy nie, ale musiałem również zignorować prywatne i chronione właściwości, więc zrobiłem tę małą funkcję, dzięki której można to zrobić.
function empty_obj(&$object, $ignore_private = true, $ignore_protected = true) {
$obj_name = get_class($object);
$obj = (array)$object;
foreach(array_keys($obj) as $prop) {
$is_private = $is_protected = false;
$prop = preg_replace("/[^\w*]/", '', $prop);
$prop_name = str_replace(array($obj_name, '*'), '', $prop);
if(preg_match("~^$obj_name$prop_name$~", $prop))
$is_private = true;
if(preg_match("~^\*$prop_name$~", $prop))
$is_protected = true;
if(!$is_private || !$is_protected || ($is_private && !$ignore_private) || ($is_protected && !$ignore_protected))
return;
}
return true;
}
Nie jestem pewien, czy jest to bardziej lub mniej skuteczne niż odlewania do tablicy, ale przypuszczam więcej. Możesz po prostu zacząć pętlę obiektu i jak tylko znajdziesz coś, na co masz odpowiedź, i przestań zapętlać.
function is_obj_empty($obj){
if(is_null($obj)){
return true;
}
foreach($obj as $key => $val){
return false;
}
return true;
}
Spróbuj bez użycia empty()
który jest:
get_object_vars($obj) ? TRUE : FALSE;
Na PHP docs możemy przeczytać UWAGA:
Podczas korzystania
empty()
na niedostępnych właściwości obiektu,__isset()
przeciążenia metoda zostanie wywołana , jeśli zostało zadeklarowane.
Czyli podczas korzystania empty()
na obiekcie, który jest o __get()
metodę, to zawsze zwraca True.
- 1. Jak sprawdzić, czy obiekt JSON jest pusty w Javie?
- 2. Jak mogę sprawdzić, czy JSON jest pusty w NodeJS?
- 3. Czy powinienem sprawdzić, czy obiekt jest pusty pierwszy czy drugi?
- 4. Jak sprawdzić, czy wpis mysql jest pusty w PhP?
- 5. Sprawdź, czy obiekt jest pusty
- 6. Jak sprawdzić, czy dynamiczny jest pusty.
- 7. wykryć, czy obiekt jest pusty
- 8. Jak sprawdzić, czy ContentPlaceHolder jest pusty?
- 9. Jak sprawdzić, czy plik jest pusty?
- 10. Jak sprawdzić, czy JTable jest pusty?
- 11. W iOS, jak sprawdzić, czy adres URL jest pusty
- 12. Jak sprawdzić, czy bufor jest pusty?
- 13. Jak sprawdzić, czy sesja PHP jest pusta?
- 14. PHANTOMJS PHP: Pusty obiekt odpowiedzi
- 15. Jak sprawdzić, czy JSONArray jest pusty w java?
- 16. Pusty obiekt w Coffeescript
- 17. Jak sprawdzić, czy obiekt jest obiektem RegExp?
- 18. Jak sprawdzić, czy obiekt jest określonego typu?
- 19. Jak sprawdzić, czy obiekt jest zerowy?
- 20. Jak sprawdzić, czy obiekt jest proxy?
- 21. Jak sprawdzić, czy obiekt jest niezmienny?
- 22. Jak sprawdzić, czy obiekt jest zdefiniowany?
- 23. Jak sprawdzić, czy obiekt jest zerowy w widoku w Ruby?
- 24. Jak sprawdzić w node.js, czy zmienna jest obiektem JSON?
- 25. Jak sprawdzić, czy dany obiekt jest obiektem lub tablicą w łańcuchu JSON
- 26. Jak sprawdzić, czy JSONObject jest pusty lub nie istnieje
- 27. Jak sprawdzić, czy zakres Excela jest pusty w C#
- 28. Jak sprawdzić, czy katalog jest pusty w ANT?
- 29. Jak sprawdzić, czy ciąg znaków jest pusty w eliksiru
- 30. Jak sprawdzić, czy ciąg znaków jest pusty w Emacs Lisp?
pokrewne: https://stetylverflow.com/q/9412126/3995261 – YakovL