bugger: bug gefunden bei array_intersect?

Hallo,

<?php
$array1 = array("a" => "green", "red", "blue");
$array2 = array("b" => "green", "yellow", "red");
$result = array_intersect($array1, $array2);

print "<pre>";
print_r($result);
print "</pre>";
?>

gibt

Array
(
    [a] => green
    [0] => red
)

und sollte überhauptkeine übereinstimmung stattfinden...

<?php
$array1 = array("a" => "green", "red", "blue");
$array2 = array("b" => "greeeeeen", "yellow", "reeeeed");
$result = array_intersect($array1, $array2);

print "<pre>";
print_r($result);
print "</pre>";
?>

gibt

Array
(
)

das finde ich aber voll doof lieber wäre mir es würde NICHTS zurückliefern! einfach >""< nichts eben ;)

so muss ich jetzt noch eine abfrage mehr einbauen...

bugger

  1. Hallo,

    das finde ich aber voll doof lieber wäre mir es würde NICHTS zurückliefern! einfach >""< nichts eben ;)

    so muss ich jetzt noch eine abfrage mehr einbauen...

    Warum nicht einfach empty für alle Fälle?

    Gruß,
    Severin

    --
    They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.
    -- Benjamin Franklin
    1. Servus,

      hmmmm...
      kannte ich noch gar nicht
      und ich dachte ich kenne schon viel... danke

      bugger

  2. Hi bugger!

    und sollte überhauptkeine übereinstimmung stattfinden...

    Wieso nicht? Die Werte "green" und "red" sind doch in beiden Arrays vorhanden.

    das finde ich aber voll doof lieber wäre mir es würde NICHTS zurückliefern! einfach >""< nichts eben ;)

    Du kannst die automatische Typumwandlung von PHP nutzen: !!$result liefert dir auf jeden Fall ein boolsches Ergebnis.

    MfG H☼psel

    --
    "It's amazing I won. I was running against peace, prosperity, and incumbency."
    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
    1. Hi Inrgid!

      und sollte überhauptkeine übereinstimmung stattfinden...

      Ah, jetzt hab´ ich´s verstanden. Dieser "Satz" bezog sich auf den nachfolgenden Code. =)

      MfG H☼psel

      --
      "It's amazing I won. I was running against peace, prosperity, and incumbency."
      George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
      Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
    2. Hallo Hopsel,

      Du kannst die automatische Typumwandlung von PHP nutzen: !!$result liefert dir auf jeden Fall ein boolsches Ergebnis.

      Iiih! Dafür nimmt man (bool)$result, soviel Aufwand muss schon sein! :-)

      Schöne Grüße,

      Johannes

  3. das finde ich aber voll doof lieber wäre mir es würde NICHTS zurückliefern! einfach >""< nichts eben ;)

    "" ist aber nicht 'nichts', sondern ein leerer String. NULL kämme dem schon näher.
    Übrigens frag ich mich, warum du gleich meinst, einen Bug gefunden zu haben, weil eine Funktion etwas zurückliefert, was dir hauptsächlich etwas mehr Schreibarbeit verschafft.

    mfg
    Rato

    --
    §§§
    Meine Postings basieren lediglich auf mein Wissen und können völliger Blödsinn sein.
    §§§
    1. Servus,

      naja ein leeres array ist nicht so die feine art das ist doch bei anderen funktionen auch nicht so, oder

      bugger

      1. hi,

        naja ein leeres array ist nicht so die feine art

        Warum soll denn eine Funktion, deren zu erwartender Rückgabewert in der Mehrzahl der Fälle ein Array ist, in so einem Fall kein Array zurückliefern?

        Es ist ein leeres Array - wunderbar. Alles andere wäre reichlich blödsinnig.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
  4. Hallo bugger,

    das finde ich aber voll doof lieber wäre mir es würde NICHTS zurückliefern! einfach >""< nichts eben ;)

    Es ist ja schade, dass die Funktion nicht so funktioniert, wie du es gerne hättest, aber das macht noch lange keinen Bug aus.

    array_intersect() returns an array containing all the values of array1 that are present in all the arguments.“

    Daraus lässt sich erkennen, dass in jedem Fall ein Array zurück gegeben wird, und "alle Werte" sind nunmal identisch mit "keine Werte", falls es keine Übereinstimmungen gibt.

    Noch ein kleines Beispiel, das zeigt, dass das von dir gewünschte Verhalten, also die Rückgabe eines leeren Strings "" oder von NULL statt eines leeren Arrays, nicht unbedingt eine Verbesserung der Funktion wäre:

    $bar = array('A', 'B');  
    $foo = array('C', 'D');  
    $foobar = array_intersect($foo, $bar);  
    foreach ($foobar as $x) {  
        // Tue irgendwas mit $x  
    }
    

    In diesem Fall wird der Schleifeninhalt einfach nicht ausgeführt, würde array_intersect() aber jetzt kein leeres Array sondern irgendetwas anderes zurückgeben, müsste man hierbei erst überprüfen, ob $foobar überhaupt ein Array ist.

    Wenn du diese Funktion öfter brauchst, kannst du dir aber einen Wrapper schreiben, der statt eines leeren Arrays irgendwas anderes zurück gibt:

    /*  
      Funktion custom_array_intersect(array $arr1, array $arr2 [, array $...])  
      
      Funktioniert wie array_intersect(), gibt aber null statt eines leeren Arrays  
      zurueck, falls keine Uebereinstimmungen gefunden wurden  
    */  
    function custom_array_intersect () {  
        $arguments = func_get_args();  
        $result = call_user_func_array('array_intersect', $arguments);  
        if (!empty($result)) {  
            return $result;  
        } else {  
            return null; // Oder auch false, "", was immer du haben willst  
        }  
    }
    

    Schöne Grüße,

    Johannes