Fügen Sie jedem Element eines PHP-Arrays ein Präfix hinzu


76

Ich habe ein PHP-Array von Zahlen, denen ich ein Minus (-) voranstellen möchte. Ich denke, durch die Verwendung von Explodieren und Implodieren wäre es möglich, aber mein Wissen über PHP ist nicht möglich, dies tatsächlich zu tun. Jede Hilfe wäre dankbar.

Im Wesentlichen möchte ich davon ausgehen:

$array = [1, 2, 3, 4, 5];

dazu:

$array = [-1, -2, -3, -4, -5];

Irgendwelche Ideen?

Antworten:


99

Einfach:

foreach ($array as &$value) {
   $value *= (-1);
}
unset($value);

Es sei denn, das Array ist eine Zeichenfolge:

foreach ($array as &$value) {
    $value = '-' . $value;
}
unset($value);

3
Nett. Die Referenzübergabe ist unerlässlich.
Peter Ajtai

6
@ Peter Ajtai Essential, aber auch sehr gefährlich. Sie sollten die referenzierte Variable immer deaktivieren : foreach ($array as &$value){ /* ... */ } unset($value);.
Dávid Horváth

1
@PeterAjtai Guter Fang, obwohl dies 57 Stimmen hat, habe ich die Antwort mit Ihrem Vorschlag aktualisiert.
Elijah Lynn

Warum ist es gefährlich?
mgutt

4
@mgutt Da PHP keine variablen Bereiche auf Blockebene hat. Wenn Sie später im Code eine Variable mit demselben Namen verwenden, wird der Inhalt der referenzierten Variablen auf magische Weise überschrieben.
Dávid Horváth

143

Eine elegante Methode zum Präfixieren von Array-Werten (PHP 5.3+):

$prefixed_array = preg_filter('/^/', 'prefix_', $array);

Darüber hinaus ist dies mehr als dreimal schneller als a foreach.


7
Ich finde das die beste Antwort, vor allem, wenn es so viel schneller ist. Erwähnenswert ist auch preg_replace, dass es ungefähr dasselbe tut, aber immer ein Array gleicher Größe mit dem unveränderten Element für Elemente zurückgibt, die nicht mit dem regulären Ausdruck übereinstimmen. Es ist auch ein bisschen leichter in Bezug auf die Versionsanforderungen (existiert in PHP4 gegenüber preg_filterPHP> = 5.3.0).
DBM

1
Gibt es eine Möglichkeit, ein Suffix hinzuzufügen?
AvikB

14
@ Avik Um ein Suffix hinzuzufügen, verwenden Sie einfach den $Anker:preg_filter('/$/', '_suffix', $array);
Dávid Horváth

Weitere Informationen zu regulären Ausdrücken in PHP finden Sie im PCRE-Handbuch: php.net/manual/en/reference.pcre.pattern.syntax.php
Dávid Horváth

1
danke, ich habe das herausgefunden preg_filter('/^(.*?)$/', '$0*', $array), es funktioniert, aber ich mag deins, es ist kurz.
Nochmals vielen

68

In diesem Fall ist Rohits Antwort wahrscheinlich die beste, aber die PHP-Array-Funktionen können in komplexeren Situationen sehr nützlich sein.

Sie können array_walk()eine Funktion für jedes Element eines Arrays ausführen, um das vorhandene Array zu ändern. array_map()macht fast das gleiche, aber es gibt ein neues Array zurück, anstatt das vorhandene zu ändern, da es so aussieht, als ob Sie weiterhin dasselbe Array verwenden möchten, das Sie verwenden sollten array_walk().

Um direkt mit den Elementen des Arrays zu arbeiten array_walk(), übergeben Sie die Elemente des Arrays mit reference ( function(&$item)).

Seit PHP 5.3 können Sie die anonyme Funktion in array_walk verwenden:

// PHP 5.3 and beyond!
array_walk($array, function(&$item) { $item *= -1; }); // or $item = '-'.$item;

Arbeitsbeispiel

Wenn Ihnen PHP 5.3 eine etwas zu schicke Hose ist, verwenden Sie sie einfach createfunction() :

// If you don't have PHP 5.3
array_walk($array,create_function('&$it','$it *= -1;')); //or $it = '-'.$it;

Arbeitsbeispiel


Wie viel langsamer ist Ihre Methode im Vergleich zu Rohits? Ich mag Einzeiler, daher wäre es schön zu wissen, wie viel "Geschwindigkeitsverlust" dies verursachen wird.
mgutt

2
Für einfache Zahlen ist wahrscheinlich eine Schleife schneller. Profilieren Sie es :) In meinem Fall musste ich Zeichenfolgen voranstellen, bevor ich das gesamte Array verkettete, und die schnellste Lösung war Array_walk, gefolgt von Implode.
CoffeDeveloper

22

So etwas würde reichen:

array_map(function($val) { return -$val;} , $array)

3
Beachten Sie, dass dies nur PHP 5.3+ ist (aufgrund der anonymen Funktion) und ein neues Array zurückgibt, anstatt das vorhandene Array zu ändern ( print_r($array)würde also $arraynach dem oben Gesagten unverändert angezeigt . - Wenn Sie den zurückgegebenen Wert $arraydiesem zuweisen, erhalten Sie das Arbeit gut gemacht.
Peter Ajtai

5
$array = [1, 2, 3, 4, 5];
$array=explode(",", ("-".implode(",-", $array)));
//now the $array is your required array

Es ist eine einzeilige Lösung. Welche Art von Erklärung möchten Sie?
Sarwar Hasan

3
Wenn einer der Array-Inhalte ein enthält, enthält ,das resultierende Array mehr Elemente als das Original. Dies funktioniert für den OP-Fall, bei dem es sich nur um Zahlen handelt.
Steven Jeffries

5

Sie können "nichts" durch eine Zeichenfolge ersetzen. So stellen Sie ein Array von Zeichenfolgen voran (keine Zahlen wie ursprünglich angegeben):

$prefixed_array = substr_replace($array, 'your prefix here', 0, 0);

Das heißt, für jedes Element des $ -Arrays wird die Zeichenfolge (Länge Null) mit Offset 0 und Länge 0 verwendet und durch das Präfix ersetzt.

Referenz: substr_replace


Dies ist eine fantastische und einfache Lösung, die die Frage beantwortet - danke!
Frankie Jarrett

2

Ich hatte die gleiche Situation vor.

Hinzufügen eines Präfixes zu jedem Array-Wert

function addPrefixToArray(array $array, string $prefix)
{
    return array_map(function ($arrayValues) use ($prefix) {
        return $prefix . $arrayValues;
    }, $array);
}

Hinzufügen eines Suffix zu jedem Array-Wert

function addSuffixToArray(array $array, string $suffix)
{
    return array_map(function ($arrayValues) use ($suffix) {
        return $arrayValues . $suffix;
    }, $array);
}

Nun zum Testteil:

$array = [1, 2, 3, 4, 5];

print_r(addPrefixToArray($array, 'prefix'));

Ergebnis

Array ([0] => prefix1 [1] => prefix2 [2] => prefix3 [3] => prefix4 [4] => prefix5)

print_r(addSuffixToArray($array, 'suffix'));

Ergebnis

Array ([0] => 1suffix [1] => 2suffix [2] => 3suffix [3] => 4suffix [4] => 5suffix)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.