Hilfe bei mehrdimensionalem Array

TTlong

Angesehenes Mitglied
Hi,

ich versuch mich grade an einem Gateway-Check (so ne Art Pingservice um zu schauen welchen HTTP-Statuscode die Abfrage zurückliefert).

Gleich erstmal die Funktion:

CODE
public function checkGatewayStatus() {
 
$gatewayArray = array('http://www.domain-1.com', 'http://www.domain-2.com', 'http://www.domain-3.com');
$multiGatewayArray = array();

foreach($gatewayArray as $url) {

   $ci = curl_init();

   // cURL Optionen setzen
   curl_setopt($ci, CURLOPT_URL, $url);
   curl_setopt($ci, CURLOPT_USERAGENT, 'Gateway Check | Botversion 1.3');
   curl_setopt($ci, CURLOPT_HEADER, 1);
   curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);
   // curl_setopt($ci, CURLOPT_FOLLOWLOCATION, TRUE);
   curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 1);

   curl_exec($ci);
   $info = curl_getinfo($ci);

   curl_close($ci);

// Alle Gateways inkl. zurück geliefertem Statuscode in $multiGatewayArray speichern
array_push($multiGatewayArray, array("$url" => $info['http_code']));

} //FOREACH Ende

print_r($multiGatewayArray);
} // Funktionsende



print_r() ist hier selbstverständlich zu Testzwecken und liefert folgende Ausgabe:

Array ( [0] => Array ( [http://www.domain-1.com] => 200 ) [1] => Array ( [http://www.domain-2.com] => 200 ) [2] => Array ( [http://www.domain-3.com] => 301 ) )

Nun möchte ich den Gateway finden, der mir den Statuscode 200 zurückliefert. Möglichst nur den Ersten, es darf/sollte ebenfalls nur ein Gateway sein.

Mit array_search('200', $multiGatewayArray); funktionierts nicht.


Jemand ne Idee wie ichs lösen könnte?

Danke und Gruß
TTlong
 
Mit einem foreach/break, einem array_walk oder array_filter vielleicht.

CODE

$arr = Array (
         0 => Array ( 'http://www.domain-1.com' => 200 ),
         1 => Array ( 'http://www.domain-2.com' => 200 ),
         2 => Array ( 'http://www.domain-3.com' => 301 ));
 
function myfunc($var)
{
   if(current($var) == 200) {
       return $var;
   }
}
         
var_dump(array_filter($arr, "myfunc"));



ergäbe dann


CODE
array
 0 =>
   array
     'http://www.domain-1.com' => int 200
 1 =>
   array
     'http://www.domain-2.com' => int 200



Aber da du nur den ersten gültigen Wert benötigst, würde ich wahrscheinlich einfach ein foreach() { break; } nehmen.
 
Hallo,

mal so aus der Hüfte geschossen:


CODE
foreach($multiGatewayArray[0] as $url => $status) {
 if ($status == 200) {
  echo $url; //Ausgabe der ersten URL mit Status 200
  break; //bricht nach erstem Fund ab
 }
}



Wie gesagt...ungetestet...aber so in etwa würde ich rangehen.

Grüße
Oli

Edit: ein wenig zu langsam :)
 
Danke für eure Antworten.

Die Variante mit break; liefert leider nur die URL zurück, wenn die erste Domain (in diesem Beispiel -> domain-1.com) nen 200'er zurück gibt. Würde domain-1.com einen 403 zurück geben, dafür aber domain-2.com einen 200'er, bleibt die Ausgabe leer (weisser Bildschirm).
 
sorry..da war ich wohl ein wenig zu schnell :) Ich hatte mich bei der Struktur des Arrays ein wenig vertan.

http://de.php.net/manual/de/function.array-keys.php

Diese Funktion sollte dir eigentlich weiterhelfen.


Edit: gerade nochmal selbst probiert...folgender Code funktioniert bei mir:

CODE
<?php

$multiGatewayArray = array(
array('http://www.domain-1.com' => 300),
array('http://www.domain-2.com' => 300),
array('http://www.domain-3.com' => 200)
);

foreach ($multiGatewayArray as $array) {
$result = array_keys($array,'200');
if (count($result) == 1) {
echo $result[0];
break;
}

}

?>



Grüße
Oli
 
CODE
<?php
foreach($multiGatewayArray as $key => $val) {
if(current($val) == 200) {
echo key($val);
break;
}
}
?>

 
Supi, danke.

Die Lösung von Heiko funktioniert, array_keys() schau ich mir dann auch noch gleich mal genauer an.

Thanks a lot.


MfG TTlong
 
Zurück
Oben