Додайте префікс до кожного елемента масиву PHP


76

У мене є масив чисел PHP, до якого я хотів би поставити префікс мінусом (-). Я думаю, що завдяки використанню explode і implode це було б можливо, але мої знання php насправді не можуть це зробити. Будь-яка допомога буде вдячна.

По суті, я хотів би піти з цього:

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

до цього:

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

Будь-які ідеї?

Відповіді:


100

Просто:

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

Якщо масив не є рядком:

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

3
Приємно. Передача за посиланням є важливою.
Peter Ajtai,

6
@Peter Ajtai Суттєвий, але також дуже небезпечний. Ви завжди повинні деактивувати посилальні змінні: foreach ($array as &$value){ /* ... */ } unset($value);.
Давід Горват

1
@PeterAjtai Хороший улов, незважаючи на те, що це 57 голосів, я пішов і оновив відповідь вашою пропозицією.
Елайджа Лінн,

Чому це небезпечно?
mgutt

4
@mgutt Оскільки PHP не має областей змінних рівня блоку. Якщо ви використовуєте змінну з тим самим іменем пізніше в коді, вона чарівно перезапише вміст вказаної змінної.
Давід Горват,

145

Елегантний спосіб префіксу значень масивів (PHP 5.3+):

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

Крім того, це більш ніж утричі швидше, ніж a foreach.


7
Я вважаю, що це найкраща відповідь, в основному, хоча це набагато швидше. Також варто згадати preg_replace, що він робить приблизно те саме, але завжди повертає масив однакового розміру з немодифікованим елементом для елементів, які не відповідають регулярному виразу. Це також трохи легше щодо вимог до версії (існує в PHP4 проти, preg_filterяка вимагає PHP> = 5.3.0).
dbm

1
чи є спосіб додати суфікс?
AvikB

14
@Avik Щоб додати суфікс, просто скористайтеся $якорем:preg_filter('/$/', '_suffix', $array);
Давід Горват

Для отримання додаткової інформації про регулярні вирази в PHP прочитайте посібник PCRE: php.net/manual/en/reference.pcre.pattern.syntax.php
Давід

1
дякую, я зрозумів це preg_filter('/^(.*?)$/', '$0*', $array), це працює, але мені подобається ваше, воно коротке. ще раз дуже дякую допомогу :)
AvikB

68

У цьому випадку відповідь Рохіта, мабуть, найкраща, але функції масиву PHP можуть бути дуже корисними в більш складних ситуаціях.

Ви можете використовувати array_walk()для виконання функції на кожному елементі масиву, що змінює існуючий масив. array_map()робить майже те саме, але повертає новий масив замість того, щоб модифікувати існуючий, оскільки, схоже, ви хочете продовжувати використовувати той самий масив, вам слід використовуватиarray_walk() .

Щоб працювати безпосередньо з елементами масиву array_walk(), передайте елементи масиву за посиланням (function(&$item) ).

З php 5.3 ви можете використовувати анонімну функцію в array_walk:

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

Робочий приклад

Якщо php 5.3 - це занадто вишукані штани для вас, просто використовуйте createfunction():

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

Робочий приклад


Наскільки повільніше ваш метод у порівнянні з Рохітсом? Мені подобається однокласний лайнер, тому було б непогано знати, скільки "втрати швидкості" це спричинить.
mgutt

2
Для простих чисел, швидше за все, швидший цикл. Профілюйте це :) У моєму випадку мені потрібно було префіксувати рядки перед конкатенацією цілого масиву, і найшвидшим рішенням був Array_walk, а потім Implode.
CoffeDeveloper

22

Щось на зразок цього:

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

3
Зверніть увагу, що це лише PHP 5.3+ (через анонімну функцію), і він повертає новий масив замість того, щоб модифікувати існуючий масив (так print_r($array)буде показано $arrayнезмінним після вищезазначеного. - Якщо ви призначите йому повернене значення, $arrayотримаєте роботу виконано гарно.
Пітер Айтай

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

Це однолінійне рішення. Якого типу пояснення ви хочете?
Sarwar Hasan

3
Якщо будь-який вміст масиву містить а, ,тоді отриманий масив буде мати більше елементів, ніж оригінал. Це працює для випадку ОП, де це лише цифри.
Стівен Джеффріс

5

Ви можете замінити "нічого" рядком. Отже, щоб додати до префіксу масив рядків (а не цифр, як було розміщено спочатку):

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

Це означає, що для кожного елемента масиву $ візьміть рядок (нульової довжини) зі зміщенням 0, довжина 0, і замініть йому префікс.

Довідка: substr_replace


це фантастичне та просте рішення, яке відповідає на питання - дякую!
Френкі Джарретт

2

У мене така ж ситуація була і раніше.

Додавання префікса до кожного значення масиву

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

Додавання суфікса до кожного значення масиву

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

Тепер частина тестування:

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

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

Результат

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

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

Результат

Array ([0] => 1suffix [1] => 2suffix [2] => 3suffix [3] => 4suffix [4] => 5suffix)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.