Добавьте префикс к каждому элементу массива PHP

У меня есть массив чисел PHP, к которому я хотел бы добавить префикс минус (-). Я думаю, что с помощью взрыва и взрыва это было бы возможно, но мои знания php не позволяют сделать это на самом деле. Любая помощь будет оценена по достоинству.

По сути, я хотел бы пойти от этого:

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

к этому:

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

Любые идеи?


person MBL    schedule 01.10.2011    source источник


Ответы (7)


Простой:

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

Если массив не является строкой:

foreach ($array as &$value) {
    $value = '-' . $value;
}
unset($value);
person Rohit Chopra    schedule 01.10.2011
comment
Хороший. Передача по ссылке обязательна. - person Peter Ajtai; 01.10.2011
comment
@Peter Ajtai Необходим, но очень опасен. Вы всегда должны деактивировать указанную переменную: foreach ($array as &$value){ /* ... */ } unset($value);. - person Dávid Horváth; 17.03.2016
comment
@PeterAjtai Хороший улов, хотя у него 57 голосов, я пошел дальше и обновил ответ с вашим предложением. - person Elijah Lynn; 19.04.2016
comment
Почему это опасно? - person mgutt; 31.03.2017
comment
@mgutt Потому что в PHP нет областей видимости переменных блочного уровня. Если позже в коде вы используете переменную с тем же именем, она волшебным образом перезапишет содержимое указанной переменной. - person Dávid Horváth; 03.04.2017
comment
Как массив может быть строкой (скаляром)? Вы имеете в виду, что массив содержит строки? - person Peter Mortensen; 06.07.2019

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

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

Кроме того, это более чем в три раза быстрее, чем foreach.

person Dávid Horváth    schedule 23.01.2015
comment
Я считаю, что это лучший ответ, в основном, хотя он намного быстрее. Также стоит упомянуть preg_replace, он делает примерно то же самое, но всегда возвращает массив того же размера с неизмененным элементом для элементов, которые не соответствуют регулярному выражению. Это также немного легче в отношении требований к версии (существует в PHP4 по сравнению с preg_filter, для которого требуется PHP ›= 5.3.0). - person dbm; 02.04.2015
comment
есть ли способ добавить суффикс? - person AvikB; 27.03.2016
comment
@Avik Чтобы добавить суффикс, просто используйте якорь $: preg_filter('/$/', '_suffix', $array); - person Dávid Horváth; 27.03.2016
comment
Для получения дополнительной информации о регулярных выражениях в PHP прочитайте руководство PCRE: php.net /manual/ru/reference.pcre.pattern.syntax.php - person Dávid Horváth; 27.03.2016
comment
спасибо, я понял это preg_filter('/^(.*?)$/', '$0*', $array), это работает, но мне нравится твоё, оно короткое. еще раз спасибо очень ценю помощь :) - person AvikB; 27.03.2016
comment
Это круто. Это определенно должен быть принятый ответ по многим причинам. Он быстрее, чем foreach, он перемещает цикломатическую сложность на внутренний подуровень PHP и может использоваться для префикса, суффикса или изменения любой части значений вашего массива, когда вы найдете шаблон, чтобы определить, где модификация имеет место. сделать. Мне нужно держать эту функцию в уме. Спасибо. - person niconoe; 12.01.2017
comment
Мне это нравится больше, чем любые другие ответы. Раньше я использовал функцию array_walk, но теперь я перешел на этот способ. Большое спасибо! - person Taufik Nur Rahmanda; 28.08.2017
comment
может ли этот метод использовать массив key в качестве префикса value? Я знаю, что foreach и array_walk могут, но интересно, это тоже - person Taufik Nur Rahmanda; 29.12.2017
comment
@TaufikNurRahmanda В PHP есть всего несколько функций, которые мгновенно объединяют ключи с их значениями (например, http_build_query). Насколько мне известно, PCRE не может этого сделать. - person Dávid Horváth; 30.12.2017
comment
Спасибо, это лучший ответ, но, кстати, я предпочитаю preg_replace. - person Luu Hoang Bac; 06.03.2020

В этом случае Rohit answer, вероятно, лучший, но функции массива 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;

Рабочий пример

person Peter Ajtai    schedule 01.10.2011
comment
Насколько медленнее ваш метод по сравнению с Rohits? Мне нравится однострочник, поэтому было бы неплохо узнать, сколько потери скорости это вызовет. - person mgutt; 09.03.2015
comment
Для простых чисел, вероятно, это скорее цикл. Профилируйте это :) В моем случае мне нужно было префиксировать строки перед объединением всего массива, и самым быстрым решением было Array_walk, за которым следует Implode. - person CoffeDeveloper; 18.04.2015
comment
Отличное решение. Если вы хотите использовать предыдущую объявленную переменную, добавьте use($XXX) перед { } : array_walk($rank, function(&$item) use($cpt) { if ($item ›= $cpt) $item += 1 ; }); - person Medhi; 18.02.2021

Что-то вроде этого:

array_map(function($val) { return -$val;} , $array)
person JRL    schedule 01.10.2011
comment
Обратите внимание, что это только PHP 5.3+ (из-за анонимной функции), и он возвращает новый массив вместо изменения существующего массива (так что print_r($array) будет показывать $array без изменений после вышеизложенного. - Если вы присвоите возвращаемое значение $array this' Выполню работу хорошо. - person Peter Ajtai; 01.10.2011

Вы можете заменить «ничего» строкой. Итак, для префикса массива строк (а не чисел, как было первоначально опубликовано):

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

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

Ссылка: substr_replace

person Dan Chadwick    schedule 25.04.2019
comment
это фантастическое и простое решение, которое отвечает на вопрос - спасибо! - person Frankie Jarrett; 20.05.2020

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

Добавление префикса к каждому значению массива

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)
person Manojkiran.A    schedule 17.04.2019

person    schedule
comment
Это однострочное решение. Какого типа объяснения вы хотите? - person Sarwar Hasan; 27.09.2016
comment
Если какое-либо содержимое массива содержит ,, то в результирующем массиве будет больше элементов, чем в исходном. Это работает для случая OP, где это просто цифры. - person Steven Jeffries; 27.09.2016