Überprüfen Sie, ob ein stdClass-Objekt “Einträge” in PHP hat

Lesezeit: 5 Minuten

Benutzer-Avatar
Ipalaus

Ich habe ein Modell, das nach Einträgen in einer Datenbank sucht. So was:

public function getByID($id)
{
    if(false == is_numeric($id))
        return false;

    $images = array();

    $query = $this->db->where("id_album", $id)->order_by("order", "ASC")->get("images");

    foreach($query->result() as $row)
        $images[] = $row;

    return (object) $images;
}

Aus meiner Sicht möchte ich wissen, ob ich Zeilen habe oder nicht, um die Bilder anzuzeigen oder nicht. Ich mache das:

<?php if(false != isset($content->images)): ?>
    <pre><?php print_r($content->images); ?></pre>
<?php endif; ?>

Aber jedes Mal, wenn ich versuche zu überspringen, wenn ich keine Ergebnisse habe (ich bekomme eine leere stdClass()), scheitere ich. Ich habe es versucht isset, $content->images != NULL, !$content->images… Ich weiß nicht, wie ich die “Severity: Notice Message: Undefined variable” überspringen soll.

Danke im Voraus.

AKTUALISIEREN:

$content hat mehr Sätze als Bilder, wie $content->_data oder $content->title.

Wenn ich KEINE Bilder in der Datenbank habe und keine Rückkehr von MySQL habe, mache ich das:

<?php echo count($content->images); ?>
<pre><?php print_r($content->images); ?></pre>

Die Ausgabe ist:

1
stdClass ( )

Benutzer-Avatar
Robert Pitt

warum kannst du nicht einfach verwenden

if(isset($content->images)) //Isset also will make sure $content is set
{

}

Auf diese Weise führen Sie Überprüfungen an beiden Entitäten durch.

Da Bilder ein Objekt sind, das iteriert werden kann, können Sie dies auch überprüfen.

if(isset($content->images) && is_object($content->images))
{

}

Außerdem scheinen Sie die falschen Vergleichsoperatoren für boolesche Werte zu verwenden, Sie sollten also die strengen Standards für den Vergleich verwenden === und nicht ==oder !== und nicht != 🙂

Frohe Weihnachten

  • Hey! Frohe Weihnachten! Ich habe die Frage aktualisiert. Ich verstehe nicht warum, wenn ich zähle ($content->images); ohne Eintrag gibt mir 1 zurück… Vielen Dank im Voraus!

    – ipalaus

    24. Dezember 2010 um 19:31 Uhr

  • versuchen und print_r($content) um zu sehen, was es zeigt, vielleicht ist das Problem tatsächlich $content->images[0] die dann das Array enthält!

    – Robert Pitt

    24. Dezember 2010 um 19:33 Uhr

  • Was ist mit PHP-Reflexion ??? php.net/manual/en/book.reflection.php das kann er auch

    – tawfekow

    24. Dezember 2010 um 19:42 Uhr

  • Reflexionen sollten in meiner Meinung nach in größerem Umfang verwendet werden, finden Sie nicht, dass das ein wenig sperrig ist, wenn Sie Funktionen wie haben isset,empty,count,is_(array|object|scaler) ?

    – Robert Pitt

    24. Dezember 2010 um 19:46 Uhr

Benutzer-Avatar
klar

Ich weiß, dies ist eine alte Frage, aber sie wurde immer noch nicht richtig beantwortet.

isset nur testet, ob ein Schlüssel existiert und nicht, wenn es null ist. Dies ist eine wichtige Unterscheidung. Siehe die Beispiele: http://us1.php.net/isset

Um richtig zu testen, ob ein Array einen Schlüssel enthält, array_key_exists sollte wie an anderer Stelle auf dieser Seite angegeben verwendet werden.

Um andererseits zu testen, ob ein Objekt eine Eigenschaft enthält, wird die property_exists Methode verwendet werden soll. property_exists() kehrt zurück TRUE auch wenn das Grundstück a NULL Wert.

Ihr Code sollte also so aussehen (ja, ich habe ihn ein wenig geändert, aber der Punkt bleibt derselbe):

<?php
    if ( isset( $content ) && property_exists( $content, 'images' ) ) {
        echo '<pre>' . print_r( $content->images, true ) . '</pre>';
    }
?>

Auf diese Frage/Antworten gestoßen, als ich versuchte herauszufinden, wie man nach einer leeren stdClass sucht.

Die gegebenen Antworten sind nicht wirklich Antworten auf die Frage im Thema, was die Leute hierher führt, die keine klare Antwort bekommen, also füge ich eine verbesserte Version hinzu:

Frage:
Überprüfen Sie, ob ein stdClass-Objekt „Einträge“ in PHP hat

Antworten:

Geben Sie die stdClass in ein Array um, siehe unten:

$someObject = new StdClass();
var_dump(empty($someObject)); // Will return false, because $someObject is an stdClass

// Convert to array
$someObjectArr = (array)$someObject;
var_dump(empty($someObjectArray)); // Will return true

  • Dies löste auch mein Problem. Ich musste überprüfen, ob ein Objekt einen Eigenschaftssatz hat, auch wenn er null ist. Ich habe array_key_exists als Vervollständigung Ihrer Lösung verwendet. +1. Vielen Dank

    – Liglo-App

    18. November 2013 um 9:38 Uhr

  • In Ihrem Fall schlage ich vor, nicht zu verwenden array_key_existsaber isset($array[$index]). Letzteres ist viel schneller, siehe: stackoverflow.com/questions/6337893/… für weitere Details.

    – Damien Overem

    18. November 2013 um 12:32 Uhr

  • @DamienOvereem verwendet isset erkennt das Vorhandensein einer Eigenschaft, die auf null gesetzt ist.

    – chiliNUSS

    21. März 2014 um 16:57 Uhr


Benutzer-Avatar
Jakob Relk

Verwenden count mit isset:

if(isset($content) && count($content)) {
  //$content has properties...
  if(isset($content->images)) { //$content->images exists
    //awesome stuff goes here...
  }  
}

Codepad-Beispiel

Ich wollte überprüfen, ob ein Objekt vorhanden ist alle der gegebenen Eigenschaften. Also habe ich das gemacht:

function hasAllProperties($object, array $properties) {
    return array_reduce(
        $properties,
        function ($acc, $property) use ($object) {
            return $acc && property_exists($object, $property);
        },
        true
    );
};

$someObject = json_decode('{"foo": "bar", "baz": "quux"}');

echo 'should be true ' . (hasAllProperties($someObject, ['foo', 'baz']) ? 'TRUE' : 'FALSE') . "\n";
echo 'should be false ' . (hasAllProperties($someObject, ['foo', 'baz', 'moo']) ? 'TRUE' : 'FALSE') . "\n";
echo 'should be false ' . (hasAllProperties($someObject, ['foo', 'moo']) ? 'TRUE' : 'FALSE') . "\n";

Dann möchten Sie vielleicht zusätzlich prüfen, ob nur eine oder mehrere der Eigenschaften vorhanden sind:

function hasAnyProperties($object, array $properties) {
    return array_reduce(
        $properties,
        function ($acc, $property) use ($object) {
            return $acc || property_exists($object, $property);
        },
        false
    );
};

$someObject = json_decode('{"foo": "bar", "baz": "quux"}');

echo 'should be true ' . (hasAnyProperties($someObject, ['foo', 'baz']) ? 'TRUE' : 'FALSE') . "\n";
echo 'should be true ' . (hasAnyProperties($someObject, ['foo', 'baz', 'moo']) ? 'TRUE' : 'FALSE') . "\n";
echo 'should be true ' . (hasAnyProperties($someObject, ['foo', 'moo']) ? 'TRUE' : 'FALSE') . "\n";
echo 'should be false ' . (hasAnyProperties($someObject, ['moo']) ? 'TRUE' : 'FALSE') . "\n";

Benutzer-Avatar
MCollard

Wenn ich das gesamte Objekt testen möchte, um zu wissen, ob ich etwas tue oder nicht, gehe ich folgendermaßen vor:

if($object != new stdClass())
{
    // do something
}

1283160cookie-checkÜberprüfen Sie, ob ein stdClass-Objekt “Einträge” in PHP hat

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy