Изменение значения массива

#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); который очищает заменяемые значения в массиве и возвращает новый массив без цикла. Вот что я имею в виду. Ну, я все равно с этим покончил…