[php] Wie kann man ein Element aus einem Array löschen und dabei den Array-Index neu erzeugen lassen?

Die erste natürliche Überlegung eines Entwicklers, wenn er ein Element aus einem Array löschen möchte, wird folgenden Ansatz hervorbringen:

unset($array[$key]);

Das funktioniert soweit auch wunderbar – es sei denn, man verwendet einen numerischen Index. Ein Beispiel:

$array = array(
    0=>'Apfel',
    1=>'Banane',
    2=>'Birne'
);
unset($array[1]);
/* ergibt:
$array = array(
    0=>'Apfel',
    2=>'Birne'
); */

Soweit verhält sich php hier natürlich völlig korrekt, allerdings möchte man in der einen oder anderen Situation einen durchgängigen Array Index haben – auch, wenn sich der Inhalt des Arrays ändert. Um dies zu erreichen, verwendet man nicht unset, sondern array_splice. Und das geht so:

array_splice($array, $key, $length);

Im Beispiel sieht es dann so aus:

$array = array(
    0=>'Apfel',
    1=>'Banane',
    2=>'Birne'
);
array_splice($array, 1, 1);
/* ergibt:
$array = array(
    0=>'Apfel',
    1=>'Birne'
); */

[Update]
Fälschlicherweise hatte ich array_values() übersehen. Ihr habt also auch diese Möglichkeit:

$array = array(
    0=>'Apfel',
    1=>'Banane',
    2=>'Birne'
);
unset($array[1]);
$array = array_values($array);
/* ergibt:
$array = array(
    0=>'Apfel',
    1=>'Birne'
); */

Vielen Dank an Patrick für den Hinweis 😉

[php] mit Firephp und Zend Framework Ajax debuggen

Webentwickler kennen Firebug – DAS Tool um Javascript und HTML/CSS zu debuggen. Natürlich zähle ich auch dazu und das Tool hat mir bereits viele Male geholfen. Neu war mir allerdings FirePHP, eine Erweiterung für Firebug. Wie der Name bereits sagt dient es dem Debugging von php, vor allem im Hinblick auf die Ajax Entwicklung.

Kann man sonst mit einfachen print_r, vardump und die() einfach durch eine Anwendung gehen – was sicher nicht die professionelste Lösung ist – so hat man diese Möglichkeit bei Ajax nicht, da es sich dabei ja um eine reine Kommunikation zwischen Javascript und dem php Backend handelt. Mittels FirePHP hat man aber nun die Möglichkeit, Nachrichten an Firebug zu senden und diese anzeigen zu lassen.

Neben der Möglichkeit des Ajax Debuggings ist das Tool auch sehr hilfreich, ohne störende print_r’s, vardump’s und die()’s Debug-Meldungen zu erhalten und somit z.B. nicht das Layout der Seite zu zerstören.

So, nun aber genug der Einführung, schauen wir uns das System doch einfach mal an…

Unter addons.mozilla.org bekommt ihr die Erweiterung FirePHP. Wichtig ist, das ihr vorher Firebug installiert habt.

FirePHP erkennt ihr nun an dem blauen Käfer neben dem Firebug Symbol:

Bevor die Zend-Applikation läuft, also am besten in der public/index.php oder der application/bootstrap.php, einfach folgende Zeilen implementieren:

$writer = new Zend_Log_Writer_Firebug();
$logger = new Zend_Log($writer);
Zend_Registry::set('debug_logger', $logger);

Damit wird der FirePHP Logger initialisiert und ist ab sofort über die Zend_Registry überall in der Applikation verfügbar.

Nun könnt ihr an jeder beliebigen Stelle folgendes ausführen (das Array in der ersten Zeile dient natürlich nur dem Test, ihr braucht nur die 2. Zeile):

$var = array("Part_1"=>"Blabla", "Item2"=>array("Part_2"=>"Blabla"));
Zend_Registry::get('debug_logger')->log($var, Zend_Log::INFO);

Und schon bekommt ihr unter Firebug folgendes serviert:

Wenn ihr auf diese Log-Zeile klickt, so öffnet sich noch ein schöner Overlay in dem die Daten noch besser lesbar werden:

Ganz wichtig noch: Damit die Debug-Meldungen erscheinen, müsst ihr den Punkt “Netzwerk” aktiviert haben – sonst kommen die Meldungen bei Firebug nicht an:

Links:
firephp.org

[php] URLs effektiver zusammensetzen

Als PHP Entwickler muss man sich ja auch ab und zu mal um den Zusammenbau von URLs kümmern – entweder wird einem diese Arbeit von einem Framework abgenommen, oder man muss manuell ran. Mir geht es hier um den manuellen Weg. Man kann da folgendermaßen rangehen:

$url = "http://host/?id=10";
if($_GET["name"] != "")
{
	$url .= '&name='$_GET["name"];
}
if($_GET["country"] != "")
{
	$url .= '&country='$_GET["country"];
}
usw.


Wie man sieht, muss man für jeden eventuellen Parameter eigene if-Abfragen bauen, deren Muster ist aber immer das gleiche. Was spricht also dagegen, es folgendermaßen zu lösen?

$url = "http://host/?id=10";
$parameters = array(
	array("name"=>"name", "value"=>$_GET["name"]),
	array("name"=>"country", "value"=>$_GET["country"])
);
foreach($parameters as $parameter)
{
	if($parameter["value"] != "")
	{
		$url .= '&'.$parameter["name"].'='.$parameter["value"];
	}
}

Ok, im ersten Moment ist der neue Code bei gleichem Ergebnis etwas umfangreicher, jedoch ergibt sich ein erheblicher Vorteil, wenn neue Parameter dazu kommen. Denn nun muss man einfach dem $parameters-Array ein neues Element hinzufügen und schon wird dieses mit in die URL eingebaut.