#php #arrays
#php #массивы
Вопрос:
Я хочу изменить значение массива без цикла-
Пример кода:
<?php
//current array
$ids = array('1113_1', '1156_6', '1342_16', '1132_3', '1165_2');
//result should be looks like this
$ids = array('1113', '1156', '1342', '1132', '1165');
?>
возможно ли это сделать без какого-либо цикла?
Комментарии:
1. Ваш вопрос может быть улучшен. Можете ли вы объяснить, почему вы хотите избежать цикла, и являются ли ваши данные динамическими или статическими?
2. Я видел пару комментариев о том, что «это все еще цикл» — вы должны знать, что вы не можете избежать цикла на некотором базовом уровне, не обрабатывая его нединамическим способом.
Ответ №1:
Вместо показанных обходных путей функции string / array вы также можете просто использовать встроенный PHP для фильтрации массивов:
$ids = array('1113_1', '1156_6', '1342_16', '1132_3', '1165_2');
$ids = array_map("intval", $ids);
Это преобразует каждую запись в целое число, которого в данном случае достаточно, чтобы получить:
Array
(
[0] => 1113
[1] => 1156
[2] => 1342
[3] => 1132
[4] => 1165
)
Комментарии:
1. Это встроенная функция PHP. И, пожалуйста, обуздайте
lol
. Здесь не форум.
Ответ №2:
Попробуйте это с помощью array_map()
:
<?php
function remove_end($n)
{
list($front) = explode("_", $n);
return $front;
}
$a = array('1113_1', '1156_6', '1342_16', '1132_3', '1165_2');
$a = array_map("remove_end", $a);
print_r($a);
?>
Демонстрация:http://codepad.org/iGJ3cJW2
Комментарии:
1. Из руководства по PHP: «Возвращает массив, содержащий все элементы arr1 после применения функции обратного вызова к каждому из них». Цикл все еще выполняется, но он инкапсулирован в вызов array_map().
2. @George, нивер сказал, что в конце цикла не было, но это определенно более короткий вызов
3. @Neal: OP сказал: «Я хочу изменить значение массива без цикла»
4. Вы найдете это в моем опубликованном ответе, но, конечно, это работает только с нединамическими данными. Если данные динамические, требуется цикл, поэтому исходный вопрос может быть некорректным.
5. @Vury, добро пожаловать 🙂 не забудьте выбрать приемлемый ответ, когда сможете 🙂
Ответ №3:
Возможно? ДА:
$ids[0] = substr($ids[0], 0, -2);
$ids[1] = substr($ids[1], 0, -2);
$ids[2] = substr($ids[2], 0, -3);
$ids[3] = substr($ids[3], 0, -2);
$ids[4] = substr($ids[4], 0, -2);
Но почему вы хотите избежать использования цикла в этом случае?
Комментарии:
1. Тогда в какой-то момент вам понадобится цикл. Если ваши данные динамические, вам нужно будет воздействовать на каждый элемент, и цикл — это способ сделать это.
2. @Vural Acar: Довольно грубо вести беседу с другими пользователями онлайн, а затем удалять свои комментарии без предупреждения.
Ответ №4:
array_map()
, но внутренне это все равно будет использовать цикл.
function $mycallback($a) {
... process $a
return $fixed_value;
}
$fixed_array = array_map('mycallback', $bad_array);
Комментарии:
1. Если вы заранее не знаете, сколько там будет элементов, чтобы вы могли выписать каждый поиск / замену отдельно, цикл — ваш единственный другой вариант. Почему вы хотите избежать циклов?
2. @Vury Каким образом это рекурсивно ?
3. array_map имеет внутреннюю рекурсию, функция array_map будет вызывать ‘MyCallback’ до тех пор, пока это не будет сделано. Конечно, «теоретически» нет способа сделать это без цикла или рекурсии. Но я только хотел знать, есть ли функция для выполнения моей работы без цикла. Пример $ids = array_unique($ids); который очищает заменяемые значения в массиве и возвращает новый массив без цикла. Вот что я имею в виду. Ну, я все равно с этим покончил…