You are not logged in.

  • Login

Dear visitor, welcome to Coder Forum. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

1

Friday, July 27th 2007, 2:28pm

Array/Objekt durchsuchen und filtern

Hi zusammen,

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

HTML Code

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


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:

PHP Quellcode

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


Matze

2

Friday, July 27th 2007, 5:22pm

Moin,
hiermit solltest du alle Benutzer mit Treffer erhalten:

PHP Quellcode

1
$alle_treffer = array_filter(create_function('$a', 'return array_search($a) === true;'), $result);

3

Friday, July 27th 2007, 5:45pm

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:

PHP Quellcode

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


hmmm....

4

Friday, July 27th 2007, 6:36pm

wann kommt endlich PHP6!? Mit einheitlicher Parameter-Reihenfolge.

Quoted

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...

PHP Quellcode

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


//UPDATE: Weitere Optimierungen

5

Friday, July 27th 2007, 8:05pm

Hi!

Hier mein jetziger Code:

PHP Quellcode

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


ergibt als Ausgabe:

HTML Code

1
2
3
4
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
 
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
Array ( )


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

Matze

6

Friday, July 27th 2007, 8:16pm

$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))

7

Monday, July 30th 2007, 1:47pm

Hi!

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

Grüße,
Matthias

P.S.

Hier noch der Code:

PHP Quellcode

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

8

Monday, July 30th 2007, 4:22pm

Hi!

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

Hier das Array:

HTML Code

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


Wie komme ich denn dann mit dem folgenden Code weiter?

PHP Quellcode

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


Merci vorab,

Matthias

9

Monday, July 30th 2007, 5:31pm

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.

10

Monday, July 30th 2007, 9:12pm

Hi!

hmmm... nein, so wie es ist gefällt es mir sehr gut, ich möchte es SO lernen. Dann werde ich mir mal mein Köpfchen zerbrechen wie ich das gebacken bekomme.

Merci,
Matze

11

Monday, July 30th 2007, 10:07pm

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.

PHP Quellcode

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

Grüße,
Matthias

12

Monday, July 30th 2007, 10:55pm

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.

PHP Quellcode

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

Similar threads

Social bookmarks