Array/Objekt durchsuchen und filtern

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Array/Objekt durchsuchen und filtern

    Hi zusammen,

    Und wieder mal scheiter ich bei den Array's. Ich habe folgendes Array:

    Quellcode

    1. Array
    2. (
    3. [0] => stdClass Object
    4. (
    5. [FirstName] =>
    6. [LastName] =>
    7. [TelephoneNumber] => 0000000000
    8. [MobilePhoneNumber] =>
    9. [EmailAddress] => matthias.@dienst.com
    10. [AccountingCode] =>
    11. [CoverPage] => Generica German
    12. [Culture] =>
    13. [OnSuccessReplyTo] =>
    14. [OnFailureReplyTo] =>
    15. [Archiving] =>
    16. [FaxHeader] =>
    17. [Custom1] =>
    18. [Custom2] =>
    19. )
    20. [1] => stdClass Object
    21. (
    22. [FirstName] => Andriy
    23. [LastName] =>
    24. [TelephoneNumber] => (05)123-4567
    25. [MobilePhoneNumber] => (05)765-4321
    26. [EmailAddress] => matthias@web.de
    27. [AccountingCode] => Some AccountingCode
    28. [CoverPage] => Generica English
    29. [Culture] => de
    30. [OnSuccessReplyTo] => test_kalina_s@dienst.com
    31. [OnFailureReplyTo] => test_kalina_f@dienst.com
    32. [Archiving] =>
    33. [FaxHeader] => %some header%
    34. [Custom1] => Some Custom field 1
    35. [Custom2] => Some Custom field 2
    36. )
    37. )
    Alles anzeigen


    So, nun möchte ich in diesem Array nach dem Wert matthias.@dienst.com suchen, falls er vorhanden ist möchte ich ihn ausgeben (das ganze Objekt).

    Sinn soll es sein damit eine Suchfunktion zu ermöglichen.

    Hier mein bisheriger Code um dieses Array auszugeben:

    Quellcode

    1. $client = new SoapClient( "http://DIENST/Service.asmx?WSDL",array("trace" => 1, "exceptions" => 1));
    2. $send->securityToken = $TheToken;
    3. $myres = $client->GetAllOutboundUsers($send);
    4. $result = $myres->OutboundUser_x005B__x005D_;
    5. print_r($result);


    Matze
    Das Leben ist binär - du bist eine 1, oder eine 0
  • Hallo großer Meister,

    Ich bekomme folgende Fehlermeldung:
    Warning: %v%v() [function.%v]: The first argument should be an array in /srv/www

    wenn ich deinen Code (falls ich es richtig eingebunden habe) teste:

    Quellcode

    1. $send->securityToken = $TheToken;
    2. $myres = $client->GetAllOutboundUsers($send);
    3. $result = $myres->OutboundUser_x005B__x005D_;
    4. print_r($result);
    5. $a="Suchkriterium";
    6. $alle_treffer = array_filter(create_function('$a', 'return array_search($a) === true;'), $result);
    7. print_r($alle_treffer);


    hmmm....
    Das Leben ist binär - du bist eine 1, oder eine 0
  • wann kommt endlich PHP6!? Mit einheitlicher Parameter-Reihenfolge.
    array array_filter ( array $input [, callback $callback] )


    Es ist erst Array, dann Callback. Vertausche also einfach mal die beiden Parameter der array_filter Funktion.

    So in der Art...

    Quellcode

    1. $suche = "wert";
    2. array_filter($result, create_function('$a', 'global $suche; return in_array($suche, $a) === true;'))


    //UPDATE: Weitere Optimierungen
  • Hi!

    Hier mein jetziger Code:

    Quellcode

    1. $send->securityToken = $TheToken;
    2. $myres = $client->GetAllOutboundUsers($send);
    3. $result = $myres->OutboundUser_x005B__x005D_;
    4. print_r($result);
    5. $suche = "wert";
    6. $alle_treffer = (array_filter($result, create_function('$a', 'global $suche; return in_array($suche, $a) === true;')));
    7. print_r($alle_treffer);


    ergibt als Ausgabe:

    Quellcode

    1. Warning: %v%v() [function.%v]: Wrong datatype for second argument in /srv/www/web2/html/provisioning/search_outbound.php(14) : runtime-created function on line 1
    2. Warning: %v%v() [function.%v]: Wrong datatype for second argument in /srv/www/web2/html/provisioning/search_outbound.php(14) : runtime-created function on line 1
    3. Array ( )


    Mir erschließt sich nicht ganz was $a sein soll.

    Matze
    Das Leben ist binär - du bist eine 1, oder eine 0
  • $a ist der Parameter zur Funktion. In diesem Fall die Array Elemente. Kannst dir die Filterfunktion ja mal in der php Doku anschauen.

    Aber beim Array ist auch der Fehler. Es ist gar kein Array - sondern ein Objekt.
    Da klappt dann nicht die Funktion in_array().

    Verwende mal statt: in_array($suche, $a) ein in_array($suche, get_object_vars($a))
  • Hi!

    Super, nun tut es, vielen Dank - Ihr seid einfach echte Spitze.

    Grüße,
    Matthias

    P.S.

    Hier noch der Code:

    Quellcode

    1. $send->securityToken = $TheToken;
    2. $myres = $client->GetAllOutboundUsers($send);
    3. $result = $myres->OutboundUser_x005B__x005D_;
    4. $suche = "matthias.orczak@web.de";
    5. $alle_treffer = (array_filter($result, create_function('$a', 'global $suche; return in_array($suche, get_object_vars($a)) === true;')));
    6. var_dump($alle_treffer);
    7. foreach ($alle_treffer as $key=>$item)
    8. echo ''.$item->FirstName.'<br />';
    9. echo ''.$item->LastName.'<br />';
    10. echo ''.$item->TelephoneNumber.'<br />';
    11. echo ''.$item->MobilePhoneNumber.'<br />';
    12. echo ''.$item->EmailAddress.'<br />';
    13. echo ''.$item->AccountingCode.'<br />';
    14. echo ''.$item->CoverPage.'<br />';
    15. echo ''.$item->OnSuccessReplyTo.'<br />';
    16. echo ''.$item->OnFailureReplyTo.'<br />';
    17. echo ''.$item->Archiving.'<br />';
    18. echo ''.$item->FaxHeader.'<br />';
    19. echo ''.$item->Custom1.'<br />';
    20. echo ''.$item->Custom2.'<br />';
    21. ?>
    Alles anzeigen
    Das Leben ist binär - du bist eine 1, oder eine 0
  • Hi!

    Ich spiel mich nun schon ne Weile damit, was ist wenn es im Objekt ein Objekt gibt?

    Hier das Array:

    Quellcode

    1. array(5) {
    2. [0]=>
    3. object(stdClass)#4 (2) {
    4. ["InboundUser"]=>
    5. object(stdClass)#5 (5) {
    6. ["Destination"]=>
    7. string(23) "498995@dummy.net"
    8. ["Culture"]=>
    9. string(0) ""
    10. ["FileFormat"]=>
    11. string(7) "XML2FAX"
    12. ["AccountingCode"]=>
    13. string(0) ""
    14. ["Archiving"]=>
    15. bool(false)
    16. }
    17. ["InboundNumber"]=>
    18. object(stdClass)#6 (2) {
    19. ["FaxNumber"]=>
    20. string(13) "49899"
    21. ["InboundNumberInfo"]=>
    22. object(stdClass)#7 (3) {
    23. ["IsTollFree"]=>
    24. bool(false)
    25. ["SpamDetection"]=>
    26. bool(false)
    27. ["SpamDestination"]=>
    28. string(0) ""
    29. }
    30. }
    31. }
    Alles anzeigen


    Wie komme ich denn dann mit dem folgenden Code weiter?

    Quellcode

    1. $send->securityToken = $TheToken;
    2. $myres = $client->GetAllOutboundUsers($send);
    3. $result = $myres->OutboundUser_x005B__x005D_;
    4. $suche = $_GET['search'];
    5. $alle_treffer = (array_filter($result, create_function('$a', 'global $suche; return in_array($suche, get_object_vars($a)) === true;')));


    Merci vorab,

    Matthias
    Das Leben ist binär - du bist eine 1, oder eine 0
  • Kannst du die Funktion überhaupt nachvollziehen?

    Vielleicht solltest du dir das nochmal mit normalen Hausmitteln zusammenbauen.
    Mit einer normalen, statt einer anonymen lambda Funktion.
    Mit einer foreach-Schleife, statt mit dem Funktionsprototypen array_filter

    Es macht ja keinen Sinn, wenn du bei jeder minimalen Änderung nachfragen musst, wenn du es auch mit anderen Mitteln selbst machen könntest.
  • So,

    Für mich habe ich es nun so gelöst, funktionieren tut es so, gibt es irgendwelche gravierenden Bedenken warum ich es NICHT so lösen sollte? (außer das es länger ist:)) - bin halt noch Anfänger.

    Quellcode

    1. $send->securityToken = $TheToken;
    2. $myres = $client->GetAllInboundNumbers($send);
    3. $result = $myres->InboundAssociation_x005B__x005D_;
    4. $sumcount = count($result);
    5. $max = count($result);
    6. $pages = 15;
    7. $result = array_splice($result, $_GET['pagecount'], $pages);
    8. $count = count($result);
    9. echo "<table width=\"100%\">";
    10. for($i=0; $i < $count; $i++) {
    11. if ($result[$i]->InboundUser->Destination != ""){
    12. echo "<tr>";
    13. echo "<td span class=\"table1\">".$result[$i]->InboundNumber->FaxNumber."</td>";
    14. echo "<td span class=\"table1\">".$result[$i]->InboundUser->Destination . "</td>";
    15. echo "</tr>";
    16. }}
    17. echo "</table>";
    18. if ($max > 15){
    19. for($i=0;$i<$max; $i+=$pages)
    20. printf('<a href="index1.php?page=show_allinbound&pagecount=%d">%d</a>', $i, $i/$pages);
    21. };
    22. ?>
    23. </table>
    24. <center><?php echo $s_desc_count1.$sumcount.$s_desc_count2; ?></center>
    Alles anzeigen

    Grüße,
    Matthias
    Das Leben ist binär - du bist eine 1, oder eine 0
  • Die Einrückungen sind etwas merkwürdig und ein paar Variablen bleiben ungenutzt, aber ist schon i.O. ;)

    Wenn du am Stil arbeiten willst, könntest du dein Code einheitlicher machen, indem du entweder alle Variablen-String-Kombinationen mit dem Punkt konkatenierst, oder printf/sprintf nutzt.

    Die Suche hast du aber dennoch nicht drin, oder?
    Muss mich entschuldigen. Hab den Output falsch gelesen. Ich dachte das einzige Klassenattribut wäre InboundUser.

    am einfachsten ist du schreibst dir eine Funktion um das Objekt in ein Array umzuwandeln. Da sich die Schnittstellen aber vermutlich nicht ändern, kannst du auch mit den Attributnamen eine individuelle Funktion bauen.

    Quellcode

    1. function object2array($object)
    2. {
    3. $return = NULL;
    4. if(is_array($object))
    5. {
    6. foreach($object as $key => $value)
    7. $return[$key] = object2array($value);
    8. }
    9. else
    10. {
    11. $var = get_object_vars($object);
    12. if($var)
    13. {
    14. foreach($var as $key => $value)
    15. $return[$key] = object2array($value);
    16. }
    17. else
    18. return strval($object); // strval and everything is fine
    19. }
    20. return $return;
    21. }
    Alles anzeigen