- Смотрите также
- Использование многомерных массивов в PHP
- Как создать многомерный массив
- Доступ к элементам в многомерном массиве
- Организация перебора всех элементов многомерного массива в цикле
- Резюме
- 5 последних уроков рубрики «PHP»
- Фильтрация данных с помощью zend-filter
- Контекстное экранирование с помощью zend-escaper
- Подключение Zend модулей к Expressive
- Совет: отправка информации в Google Analytics через API
- Подборка PHP песочниц
Смотрите также
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).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)
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» ;
Использование многомерных массивов в PHP
Элементы массива в PHP могут содержать значения любого типа, такие как числа, строки, объекты. Они также могут содержать и другие массивы, что фактически означает создание многомерного или вложенного массива.
В данном уроке рассматриваются многомерные (вложенные) массивы PHP. Объясняется, как их создать, как ими манипулировать, как организовать цикл по всему многомерному массиву в PHP.
Как создать многомерный массив
Создать многомерный массив можно с помощью конструкции array() , что очень похоже на создание обычного массива. Разница заключается в том, что в многомерном массиве каждый элемент также является массивом.
$myArray = array( array( value1, value2, value3 ), array( value4, value5, value6 ), array( value7, value8, value9 ) );
В выше приведённом примере создаётся двумерный массив. Массив верхнего уровня содержит 3 элемента. Каждый элемент также является массивом, содержащим 3 значения.
Также можно использовать ассоциативный массив в качестве многомерного массива. Следующий пример демонстрирует создание индексированного массива, который содержит 3 ассоциативных массива:
$movies = array( array( "title" => "Rear Window", "director" => "Alfred Hitchcock", "year" => 1954 ), array( "title" => "Full Metal Jacket", "director" => "Stanley Kubrick", "year" => 1987 ), array( "title" => "Mean Streets", "director" => "Martin Scorsese", "year" => 1973 ) );
Можно вкладывать массивы один в другой настолько глубоко, насколько нужно (хотя на практике глубина вложенности редко бывает больше 3-х уровней). В примере ниже демонстрируется 3-х мерный массив:
$myArray = array( array( array( value1, value2 ), array( value3, value4 ) ), array( array( value5, value6 ), array( value7, value8 ) ) );
Доступ к элементам в многомерном массиве
Для получения доступа к элементам многомерного массива можно использовать синтаксис «квадратных скобок», который используется для работы с обычным массивом. Если нужно получить доступ к элементам второго уровня в двумерном массиве нужно просто использовать второй набор квадратных скобок, например:
$myArray = array( array( "один", "два", "три" ), array( "четыре", "пять", "шесть" ) ); // Выводим "шесть" echo $myArray[1][2]; ?>
А вот пример, который демонстрирует доступ к различным элементам многомерного массива $movies , который мы создали раньше:
echo "Название первого фильма:
"; echo $movies[0]["title"] . "
"; echo "Режисер третьего фильма:
"; echo $movies[2]["director"] . "
"; echo "Вложенный массив, который содержится в первом элементе:
"; print_r( $movies[0] ); echo "
";
Выполнение кода выдаст следующий результат:
Название первого фильма: Rear Window Режисер третьего фильма: Martin Scorsese Вложенный массив, который содержится в первом элементе: Array ( [title] => Rear Window [director] => Alfred Hitchcock [year] => 1954 )
Последний пример использует $movies[0] для организации доступа ко всему вложенному массиву в первом элементе массива верхнего уровня, а затем используется функция print_r() для вывода содержимого массива.
Организация перебора всех элементов многомерного массива в цикле
Так же, как и для обычного одномерного массива можно использовать foreach для организации перебора всех элементов многомерного массива. Нужно создать вложенный цикл foreach , то есть один цикл внутри другого:
- Внешний цикл берет каждый элемент массива верхнего уровня..
- Для каждого элемента верхнего уровня внутренний цикл перебирает вложенный массив, и так далее.
В примере создаётся 2-у мерный массив с информацией по фильмам, а затем организуется цикл по элементам массива для вывода информации на страницу:
$movies = array( array( "title" => "Rear Window", "director" => "Alfred Hitchcock", "year" => 1954 ), array( "title" => "Full Metal Jacket", "director" => "Stanley Kubrick", "year" => 1987 ), array( "title" => "Mean Streets", "director" => "Martin Scorsese", "year" => 1973 ) ); foreach ( $movies as $movie ) < echo '
- '; foreach ( $movie as $key => $value ) < echo "
- $key
- $value "; > echo '
Выполнение данного кода выдаст следующий результат:
title Rear Window director Alfred Hitchcock year 1954 title Full Metal Jacket director Stanley Kubrick year 1987 title Mean Streets director Martin Scorsese year 1973
Резюме
Многомерные массивы подходят для хранения любых данных, например, для хранения множественных записей баз данных или значений для отображения в таблицах. Использование многомерных массивов может повысить уровень функциональности скриптов PHP.
Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: www.elated.com/articles/php-multidimensional-arrays/
Перевел: Сергей Фастунов
Урок создан: 30 Июля 2010
Просмотров: 166748
Правила перепечатки
5 последних уроков рубрики «PHP»
Фильтрация данных с помощью zend-filter
Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.
Контекстное экранирование с помощью zend-escaper
Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.
Подключение Zend модулей к Expressive
Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.
Совет: отправка информации в Google Analytics через API
Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.
Подборка PHP песочниц
Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.