kostenloser Webspace werbefrei: lima-city


Leere Elemente aus Array ersetzen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    na-web

    na-web hat kostenlosen Webspace.

    Hallo Community.
    Ich habe mal wieder ein Problem. Ich möchte alle leeren Elemente in einem Array mithilfe von PHP ersetzen. Ich habe bereits gegoogelt. Jedoch habe ich nur Lösungen gefunden, die alle leeren Elemente löschen. Das hilft mir aber nicht weiter, kann mir jemand helfen? Ich habe bereits das versucht, hat aber nicht geklappt:
    preg_replace("/^$/", "Ersatz", $array);
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. h***********r

    Das müsste doch funktionieren?
    <?php
    $array = array( 'abc','','hallo','b§um','1234'); //Dein Array
    $ersetzen = "ERSATZ"; //Dein Ersatz
    $array = preg_replace("/^$/", $ersetzen, $array);
    var_dump($array);
    ?>

    Das gibt dann ein Array nach:
    array( 'abc','ERSATZ','hallo','b§um','1234');

    zurück.

    Oder meinst du mit leer ' '?
    Dann geht das so doch auch:
    <?php
    $array = array( 'abc','','hallo','b§um','1234'); //Dein Array
    $ersetzen = "ERSATZ"; //Dein Ersatz
    $suche = array('/^$/ ','/^ *$/');
    $array = preg_replace($suche, $ersetzen, $array);
    var_dump($array);
    ?>


    Beitrag zuletzt geändert: 13.2.2018 20:51:44 von horstexplorer
  4. Mit dem Array
    $array = ['a', 'sdsdad', '', ' ', 213, 'a b', ' ab'];
    tut dein Code einwandfrei.
    Was definierst du denn als "leer"? Wenn das Element aus einem Tab oder Leerzeichen besteht ist es z.B. nicht mehr "leer".
    Da könntest du einfach eine Abfrage nach dem Whitespace mit rein packen -> "/^[\s]?$/"
  5. Autor dieses Themas

    na-web

    na-web hat kostenlosen Webspace.

    Tut mir leid, das nützt nichts. Ihr habt gesagt ich solle das verwenden:
    <?php
    $array = array('', '', 'test');
    preg_replace("/^[\s]?$/", "Ersatz", $array);
    var_dump($array);
    ?>
    Leider nützt das nicht. Die Rückgabe ist immer noch
    array(3) { [0]=> string(0) "" [1]=> string(0) "" [2]=> string(4) "test" }
    Woran liegt das wohl?
  6. h***********r

    Du versuchst "Leerzeichen" zu entfernen anstelle von leeren Eintragen.
    Nimm mein zweites Beispiel und erweitere das Suchmuster Array mit dem von nuellerlukas
    Bzw stimmt sonnst was mit der regex nicht

    Beitrag zuletzt geändert: 14.2.2018 11:45:09 von horstexplorer
  7. Die Funktion preg_replace ersetzt die Array-Elemente nicht in-place, sondern gibt ein neues Array zurück.

    Anstatt
    preg_replace("/^[\s]?$/", "Ersatz", $array);
    müsstest du also
    $array = preg_replace("/^[\s]?$/", "Ersatz", $array);
    schreiben.

    @horstexplorer:
    Hinter dem Ausdruck für Whitespaces steht ein Fragezeichen, d.h. der String kann ein Leerzeichen enthalten, muss aber nicht.
  8. h***********r

    fuerderer schrieb:
    Die Funktion preg_replace ersetzt die Array-Elemente nicht in-place, sondern gibt ein neues Array zurück.

    Anstatt
    preg_replace("/^[\s]?$/", "Ersatz", $array);
    müsstest du also
    $array = preg_replace("/^[\s]?$/", "Ersatz", $array);
    schreiben.

    @horstexplorer:
    Hinter dem Ausdruck für Whitespaces steht ein Fragezeichen, d.h. der String kann ein Leerzeichen enthalten, muss aber nicht.

    Stimmt. Habs Grad ned überprüfen können. Der Teil der fehlt steht sogar oben so :D

    Beitrag zuletzt geändert: 14.2.2018 11:53:48 von horstexplorer
  9. Wobei ein Asterisk da wahrscheinlich tatsächlich noch sinnvoller wäre. Würde dann auch solche Späße wie "{TAB}{TAB}{Leerzeichen}" abdecken.
    Aber das ist halt eigentlich alles nicht "leer".

    Vermutlich lag das Hauptproblem aber wirklich nur daran, dass der TO nicht die Rückgabe genutzt hat, wie von fuerderer schon angemerkt.
  10. Obwohl der Ansatz mit preg_replace ein wenig simpler ist, empfehle ich den "manuellen" weg, dieser ist schneller und einfacher zu lesen für jemand der mit dem Projekt nicht vertraut ist oder Schwierigkeiten mit REGEX hat.

    BenchmarkCode:
    <?php
    
    $runs = 1000000;
    
    $subject = array( 'abc','','hallo','b§um','1234');
    $replace = "ERSATZ";
    
    function arrayFillEmpty(array $subject, $replace) :? array {
    	foreach($subject as $k => $v) {
    		if(!isset($v) || empty($v)) {
    			$v = $replace;
    		}
    		$res[$k] = $v;
    	}
    	return $res ?? null;
    }
    
    
    $i = 1;
    $start = microtime(true);
    while($runs >= $i) {
    	$res = preg_replace("/^$/", $replace, $subject);
    	$i++;
    }
    $end = microtime(true);
    echo 'PregReplace: '.($end - $start).'<br />';
    
    
    $i = 1;
    $start = microtime(true);
    while($runs >= $i) {
    	foreach($subject as $k => $v) {
    		if(!isset($v) || empty($v)) {
    			$v = $replace;
    		}
    		$res[$k] = $v;
    	}
    	$i++;
    }
    $end = microtime(true);
    echo 'ForEach: '.($end - $start).'<br />';
    
    
    $i = 1;
    $start = microtime(true);
    while($runs >= $i) {
    	$res = arrayFillEmpty($subject, $replace);
    	$i++;
    }
    $end = microtime(true);
    echo 'FunctionWrapper: '.($end - $start).'<br />';


    Ergebnisse nach 1 Millionen Runs (PHP 7.2):
    PregReplace: 0.77664995193481
    ForEach: 0.42974305152893
    FunctionWrapper: 0.70969295501709


    FinalerCode:
    <?php
    
    $subject = array( 'abc','','hallo','b§um','1234');
    $replace = "ERSATZ";
    
    
    foreach($subject as $k => $v) {
    	if(!isset($v) || empty($v)) {
    		$v = $replace;
    	}
    	$res[$k] = $v;
    }


    Hab zum Spaß sogar noch nen function wrapper gebastelt, selbst dieser ist ein wenig schneller und sauberer als der weg über preg_replace ;)

    Beitrag zuletzt geändert: 16.2.2018 11:52:28 von strange
  11. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!