Leere Elemente aus Array ersetzen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abdecken
array
ausdruck
code
element
ersatz
ersetzen
fragezeichen
funktion
jemand
leeren elemente
re
run
schwierigkeit
start
string
suche
tab
test
url
-
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);
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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 -
Mit dem Array
tut dein Code einwandfrei.$array = ['a', 'sdsdad', '', ' ', 213, 'a b', ' ab'];
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]?$/" -
Tut mir leid, das nützt nichts. Ihr habt gesagt ich solle das verwenden:
Leider nützt das nicht. Die Rückgabe ist immer noch<?php $array = array('', '', 'test'); preg_replace("/^[\s]?$/", "Ersatz", $array); var_dump($array); ?>
Woran liegt das wohl?array(3) { [0]=> string(0) "" [1]=> string(0) "" [2]=> string(4) "test" }
-
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 -
Die Funktion preg_replace ersetzt die Array-Elemente nicht in-place, sondern gibt ein neues Array zurück.
Anstattpreg_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. -
fuerderer schrieb:
Die Funktion preg_replace ersetzt die Array-Elemente nicht in-place, sondern gibt ein neues Array zurück.
Anstattpreg_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 -
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. -
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage