Php добавить к каждому элементу массива

Выполнить функцию для каждого элемента массива

Выполнить функцию для каждого элемента массива можно через функцию array_map() .

$array = ['php', 'mysql']; # сделать все элементы массива прописными буквами function do_upper($arr) < return mb_strtoupper($arr, 'UTF-8'); > $array_upper = array_map('do_upper', $array); $array_upper; // [PHP, MYSQL] 

Если в функцию array_map() будет передан вложенный массив, то PHP вернёт ошибку «Warning: mb_strtoupper() expects parameter 1 to be string, array given».

2-ой способ: заменить текущие элементы массивы

Функция array_map() возвращает новый массив, не затрагивая исходный массив. Также есть функция array_walk() , которая заменяет элементы в указанном массиве, применяя к ним указанную функцию.

$array = ['php', 'mysql']; # сделать все элементы массива прописными буквами function do_upper(&$arr) < $arr = mb_strtoupper($arr, 'UTF-8'); > array_walk($array, 'do_upper'); $array; // [PHP, MYSQL] 

Функция array_walk() также не поддерживет вложенные массивы (выводит ошибку «Warning: mb_strtoupper() expects parameter 1 to be string, array given»).

Но есть отдельная функция array_walk_recursive() , которая применяет код к каждому элементу массиву, включая элементы вложенных массивов.

$array = ['php', 'mysql', ['zend']]; function do_upper(&$arr) < $arr = mb_strtoupper($arr, 'UTF-8'); > array_walk_recursive($array, 'do_upper'); print_r($array); /* Array ( [0] => PHP, [1] => MYSQL, [2] => Array ( [0] => ZEND ) ) */ 

Также можно использовать цикл foreach через символ & .

$array = [2, 4, 6]; foreach ($array as &$arr) < $arr *= 2; > unset($arr); // array(4, 8, 12) 

На примере выше удаляется переменная $arr , чтобы случайно не изменить последний элемент массива в другом коде.

Обновлено: 31 декабря 2020 | История изменений

Авторизуйтесь, чтобы добавлять комментарии

Источник

php. Применить функцию к каждому элементу массива

Данный материал предоставлен сайтом PacificSky.Ru исключительно в ознакомительных целях. Администрация не несет ответственности за его содержимое.

Если вам понадобилось применить функцию к каждому элементу массива, а использовать циклы вы не хотите, то вы можете воспользоваться функцией array_walk().

Допустим у вас есть массив с числами, где числа могут быть с типом int или представлять из себя строки с цифрами и при этом могут содержать пробелы.
Но вам нужно вывести только строки и избавиться от пробелов.

Исходный массив с числами:

$array = [ 0, 2, 4, '6', 6, 8, ' 8', '8', 10, ' 2', '4 ', '4', '0' ];

Для решения задачи воспользуемся функцией array_walk().
Данная функция перебирает весь массив $array и работает с каждым элементом массива.
Для того, чтобы изменить каждый элемент массива, необходимо перед параметром $value указать символ & и работать со значениями по ссылке &$value.
Внутри array_walk() используем функцию trim, которая удаляет пробелы вначале и конце строки и приводит значение к типу string:

Array ( [0] => 0 [1] => 2 [2] => 4 [3] => 6 [4] => 6 [5] => 8 [6] => 8 [7] => 8 [8] => 10 [9] => 2 [10] => 4 [11] => 4 [12] => 0 )

Источник

array_walk

Применяет пользовательскую функцию callback к каждому элементу массива array .

Читайте также:  Шаблон бота telegram python

array_walk() не подвержена влиянию внутреннего указателя массива array . array_walk() обойдёт все элементы массива независимо от позиции указателя.

Список параметров

Обычно функция callback принимает два параметра. В качестве первого параметра идет значение элемента массива array , а ключ — в качестве второго.

Замечание:

Если требуется, чтобы функция callback изменила значения в массиве, определите первый параметр callback как ссылку. Тогда все изменения будут применены к элементам оригинального массива.

Замечание:

Множество встроенных функций (например, strtolower() ) выводят предупреждение, если им передано больше параметров, чем они ожидают, или которые не могут непосредственно использоваться в callback .

Потенциально изменены могут быть только значения массива array ; структура самого массива не может быть изменена, то есть нельзя добавить, удалить или поменять порядок элементов. Если callback-функция не соответствует этому требованию, поведение данной функции станет неопределённым и непредсказуемым.

Если указан необязательный параметр userdata , он будет передан в качестве третьего параметра в callback-функцию callback .

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Ошибки

Если функция callback требует больше параметров, чем передано на самом деле, каждый раз, когда array_walk() будет вызывать callback , будет генерироваться ошибка уровня E_WARNING.

Примеры

Пример #1 Пример использования array_walk()

$fruits = array( «d» => «lemon» , «a» => «orange» , «b» => «banana» , «c» => «apple» );

function test_print ( $item2 , $key )
echo » $key . $item2
\n» ;
>

echo «До . \n» ;
array_walk ( $fruits , ‘test_print’ );

array_walk ( $fruits , ‘test_alter’ , ‘fruit’ );
echo «. и после:\n» ;

array_walk ( $fruits , ‘test_print’ );
?>

Результат выполнения данного примера:

До . d. lemon a. orange b. banana c. apple . и после: d. fruit: lemon a. fruit: orange b. fruit: banana c. fruit: apple

Смотрите также

  • array_walk_recursive() — Рекурсивно применяет пользовательскую функцию к каждому элементу массива
  • iterator_apply() — Вызывает функцию для каждого элемента в итераторе
  • list() — Присваивает переменным из списка значения подобно массиву
  • each() — Возвращает текущую пару ключ/значение из массива и смещает его указатель
  • call_user_func_array() — Вызывает пользовательскую функцию с массивом параметров
  • array_map() — Применяет callback-функцию ко всем элементам указанных массивов
  • информация о типе callback
  • foreach

Источник

Смотрите также

A simple trick that can help you to guess what diff/intersect or sort function does by name.

[suffix] assoc — additional index check. Compares both value and index.

Example: array_diff_assoc, array_intersect_assoc.

[suffix] key — index only check. Ignores value of array, compares only indexes.

Example: array_diff_key, array_intersect_key.

[suffix] **empty** — no «key» or «assoc» word in suffix. Compares values only. Ignores indexes of array.

Example: array_diff, array_intersect.

[prefix] u — will do comparison with user defined function. Letter u can be used twice in some functions (like array_udiff_uassoc), this means that you have to use 2 functions (one for value, one for index).

Example: array_udiff_uassoc, array_uintersect_assoc.

This also works with array sort functions:

[prefix] a — associative. Will preserve keys. [prefix] k — key sort. Will sort array by keys. [prefix] r — reverse. Will sort array in reverse order. [prefix] u — sort by user defined function (same as for diff/intersect).
Читайте также:  Html head load script

Big arrays use a lot of memory possibly resulting in memory limit errors. You can reduce memory usage on your script by destroying them as soon as you´re done with them. I was able to get over a few megabytes of memory by simply destroying some variables I didn´t use anymore.
You can view the memory usage/gain by using the funcion memory_get_usage(). Hope this helps!

I need to take an element from the Array and change its position within the Array by moving the rest of the elements as required.
This is the function that does it. The first parameter is the working Array. The second is the position of the element to move and the third is the position where to move the element.
The function returns the modified Array.
function array_move_elem ( $array , $from , $to ) if ( $from == $to ) < return $array ; >
$c = count ( $array );
if (( $c > $from ) and ( $c > $to )) if ( $from < $to ) $f = $array [ $from ];
for ( $i = $from ; $i < $to ; $i ++) $array [ $i ] = $array [ $i + 1 ];
>
$array [ $to ] = $f ;
> else $f = $array [ $from ];
for ( $i = $from ; $i > $to ; $i —) $array [ $i ] = $array [ $i — 1 ];
>
$array [ $to ] = $f ;
>

?>
Examples:
$array = array( ‘Cero’ , ‘Uno’ , ‘Dos’ , ‘Tres’ , ‘Cuatro’ , ‘Cinco’ , ‘Seis’ , ‘Siete’ , ‘Ocho’ , ‘Nueve’ , ‘Diez’ );
$array = array_move_elem ( $array , 3 , 5 ); // Move element in position 3 to position 5.
print_r ( $array );

$array = array_move_elem ( $array , 5 , 3 ); // Move element in position 5 to position 3, leaving array as it was. 😉
print_r ( $array );

?>
Return:
Array ( [ 0 ] => Cero [ 1 ] => Uno [ 2 ] => Dos [ 3 ] => Cuatro [ 4 ] => Cinco [ 5 ] => Tres [ 6 ] => Seis [ 7 ] => Siete [ 8 ] => Ocho [ 9 ] => Nueve [ 10 ] => Diez )
Array ( [ 0 ] => Cero [ 1 ] => Uno [ 2 ] => Dos [ 3 ] => Tres [ 4 ] => Cuatro [ 5 ] => Cinco [ 6 ] => Seis [ 7 ] => Siete [ 8 ] => Ocho [ 9 ] => Nueve [ 10 ] => Diez )
?>

Updated code of ‘indioeuropeo’ with option to input string-based keys.

FUNCTION:
function array_move_elem ( $array , $from , $to ) // return if non-numeric couldn’t be found or from=to
if(! is_numeric ( $from )) if( array_search ( $from , array_keys ( $array ))!== FALSE ) $from = array_search ( $from , array_keys ( $array ));
>else return $array ;
>
>
$array_numeric_keys = array();
foreach( $array as $k => $v ) $array_numeric_keys [] = $k ;
>
if ( $from == $to ) < return $array ; >
$c = count ( $array_numeric_keys );
if (( $c > $from ) and ( $c > $to )) if ( $from < $to ) $f = $array_numeric_keys [ $from ];
for ( $i = $from ; $i < $to ; $i ++) $array_numeric_keys [ $i ] = $array_numeric_keys [ $i + 1 ];
>
$array_numeric_keys [ $to ] = $f ;
> else $f = $array_numeric_keys [ $from ];
for ( $i = $from ; $i > $to ; $i —) $array_numeric_keys [ $i ] = $array_numeric_keys [ $i — 1 ];
>
$array_numeric_keys [ $to ] = $f ;
>

>
$array_new = array();
foreach( $array_numeric_keys as $v ) $array_new [ $v ] = $array [ $v ];
>
return $array_new ;
>
?>

Here is a function to find out the maximum depth of a multidimensional array.

// return depth of given array
// if Array is a string ArrayDepth() will return 0
// usage: int ArrayDepth(array Array)

Читайте также:  How to uninstall java mac os

function ArrayDepth ( $Array , $DepthCount =- 1 , $DepthArray =array()) $DepthCount ++;
if ( is_array ( $Array ))
foreach ( $Array as $Key => $Value )
$DepthArray []= ArrayDepth ( $Value , $DepthCount );
else
return $DepthCount ;
foreach( $DepthArray as $Value )
$Depth = $Value > $Depth ? $Value : $Depth ;
return $Depth ;
>
?>

While PHP has well over three-score array functions, array_rotate is strangely missing as of PHP 5.3. Searching online offered several solutions, but the ones I found have defects such as inefficiently looping through the array or ignoring keys.

The following array_rotate() function uses array_merge and array_shift to reliably rotate an array forwards or backwards, preserving keys. If you know you can trust your $array to be an array and $shift to be between 0 and the length of your array, you can skip the function definition and use just the return expression in your code.

function array_rotate ( $array , $shift ) if(! is_array ( $array ) || ! is_numeric ( $shift )) if(! is_array ( $array )) error_log ( __FUNCTION__ . ‘ expects first argument to be array; ‘ . gettype ( $array ). ‘ received.’ );
if(! is_numeric ( $shift )) error_log ( __FUNCTION__ . ‘ expects second argument to be numeric; ‘ . gettype ( $shift ). » ` $shift ` received.» );
return $array ;
>
$shift %= count ( $array ); //we won’t try to shift more than one array length
if( $shift < 0 ) $shift += count ( $array ); //handle negative shifts as positive
return array_merge ( array_slice ( $array , $shift , NULL , true ), array_slice ( $array , 0 , $shift , true ));
>
?>
A few simple tests:
$array =array( «foo» => 1 , «bar» => 2 , «baz» => 3 , 4 , 5 );

print_r ( array_rotate ( $array , 2 ));
print_r ( array_rotate ( $array , — 2 ));
print_r ( array_rotate ( $array , count ( $array )));
print_r ( array_rotate ( $array , «4» ));
print_r ( array_rotate ( $array , — 9 ));
?>

Short function for making a recursive array copy while cloning objects on the way.

function arrayCopy ( array $array ) $result = array();
foreach( $array as $key => $val ) if( is_array ( $val ) ) $result [ $key ] = arrayCopy ( $val );
> elseif ( is_object ( $val ) ) $result [ $key ] = clone $val ;
> else $result [ $key ] = $val ;
>
>
return $result ;
>
?>

/*to change an index without rewriting the whole table and leave at the same place.
*/
function change_index (& $tableau , $old_key , $new_key ) $changed = FALSE ;
$temp = 0 ;
foreach ( $tableau as $key => $value ) switch ( $changed ) case FALSE :
//creates the new key and deletes the old
if ( $key == $old_key ) $tableau [ $new_key ] = $tableau [ $old_key ];
unset( $tableau [ $old_key ]);
$changed = TRUE ;
>
break;

case TRUE :
//moves following keys
if ( $key != $new_key ) $temp = $tableau [ $key ];
unset( $tableau [ $key ]);
$tableau [ $key ] = $temp ;
break;
>
else < $changed = FALSE ;>//stop
>
>
array_values ( $tableau ); //free_memory
>

//Result :
$tableau = array( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 );
$res = print_r ( $tableau , TRUE );
$longueur = strlen ( $res ) — 1 ;
echo «Old array :\n» . substr ( $res , 8 , $longueur ) . «\n» ;

change_index ( $tableau , 2 , ‘number 2’ );
$res = print_r ( $tableau , TRUE );
$longueur = strlen ( $res ) — 10 ;
echo «New array :\n» . substr ( $res , 8 , $longueur ) . «\n» ;

Источник

Оцените статью