Php вывести многомерный массив. Обработка многомерных ассоциативных массивов PHP. Цикл for и ассоциативные массивы
На уроке будут рассмотрены возможности по работе с массивами в php, объявление массива, виды массивов: многомерные и ассоциативные массивы
- Массивы с числовыми индексами
- Ассоциативный массив
$fruits="яблоко"; $fruits="груша"; $fruits="апельсин"; $fruits="абрикос";
Данный вариант инициализации массива сегодня практически не используется. Используется следующий вариант работы с массивами:
Данный вариант создания массива использует объект array:
$fruits = array(1 => "яблоко", 2 => "груша", 3 => "апельсин", 4 => "абрикос"); // Начиная с версии PHP 5.4 $fruits = array[ 1 => "яблоко", 2 => "груша", 3 => "апельсин", 4 => "абрикос" ];
Доступ к элементам массива
1 2 3 4 5 6 7 8 | $fruits
[
0
]
=
"яблоко"
;
$fruits
[
1
]
=
"груша"
;
$fruits
[
2
]
=
"апельсин"
;
$fruits
[
3
]
=
"абрикос"
;
echo
"Первый элемент массива - "
.
$fruits
[
0
]
.
" " ; echo "Второй элемент массива - " . $fruits [ 1 ] . " " ; echo "Третий элемент массива - " . $fruits [ 2 ] . " " ; |
$fruits="яблоко";
$fruits="груша";
$fruits="апельсин";
$fruits="абрикос";
echo "Первый элемент массива - ". $fruits ."
";
echo "Второй элемент массива - ". $fruits ."
";
echo "Третий элемент массива - ". $fruits ."
";
Результатом выполнения программы будет:
Важно: В качестве индекса элемента в ассоциативном массиве может быть не число, а слово (тип string )
Рассмотрим пример:
Пример: Создать массив student со значениями имен, фамилий и возраста студентов. Вывести на экран значения элементов массива
$student = array("Name" => John,
"Surname" => Smith,
"Age" => 20);
echo "имя пользователя " . $student["Name"] . "
";
$student["Name"] = "John";
$student["Surname"] = "Smith";
$student["Age"] = 20;
echo "имя пользователя " . $student["Name"] . "
";
echo "фамилия пользователя " . $student["Surname"] . "
";
echo "возраст пользователя " . $student["Age"] . "
";
Результат:
Важно: Строковые ключи (индексы) нужно всегда заключать в кавычки
Индексированные массивы без ключа:
Также следует учесть, что индексы в массиве вообще можно не писать при инициализации массива значениями. Тогда мы создаем так называемый массив-коллекцию (объект-коллекцию ):
$student = array ("John" , "Smith" , 20 ) ; $student = array("John","Smith", 20);
В таком случае интерпретатор сам присвоит им числовые индексы, начиная с 0
Пример
преобразования типов и перезаписи элементов.
Обратите внимание на использование процедуры var_dump()
1 2 3 4 5 6 7 8 9 | "a" , "1" => "b" , 2 => "c" , 2 => "d" , ) ; var_dump ($my_array ) ; ?> |
"a", "1"=> "b", 2 => "c", 2 => "d",); var_dump($my_array); ?>
Результат:
Array(3) { => string(1) "a" => string(1) "b" => string(1) "d" }
Пример использования многомерного массива и организации доступа к его элементам
1 2 3 4 5 6 7 8 9 10 11 12 | "1" , 2 => 2 , "multi" => array ( "1_1" => "1_1" ) ) ; var_dump ($array_odnom [ "first" ] ) ; var_dump ($array_odnom [ 2 ] ) ; var_dump ($array_odnom [ "multi" ] [ "1_1" ] ) ; ?> |
"1", 2 => 2, "multi" => array("1_1" => "1_1")); var_dump($array_odnom ["first"]); var_dump($array_odnom ); var_dump($array_odnom ["multi"]["1_1"]); ?>
Результат:
String(1) "1" int(2) string(3) "1_1"
Пример: создать двумерный массив размерностью 3 х 2. Заполнить его значениями для первой строки: «1_1», «1_2», «1_3»; для второй строки: «2_1», «2_2», «2_3». Вывести на экран первый элемент массива
Выполнение:
1 2 3 4 5 6 7 8 9 10 11 12 | $array_odnom = array ( 1 => array ( 1 => "1_1" , 2 => "1_2" , 3 => "1_3" ) , 2 => array ( 1 => "2_1" , 2 => "2_2" , 3 => "2_3" ) , ) ; echo $array_odnom [ 1 ] [ 1 ] ; |
$array_odnom = array(1 => array(1 => "1_1", 2 => "1_2", 3 => "1_3"), 2 => array(1 => "2_1", 2 => "2_2", 3 => "2_3"),); echo $array_odnom;
Задание php2_1: создайте двумерный массив 3 х 3 — верхний левый угол таблицы умножения Пифагора(1, 2, 3; 4, 6, 8 …)
Лабораторная работа:
Допустим, у Вас есть какое-то объявление и несколько разных людей, которым нужно это объявление отправить. Для этого Вы делаете заготовку с содержанием объявления, внутри которого есть ряд изменяющихся параметров: массива имен людей и массив событий. Вывести один вариант итогового объявления на экран. Для задания массивов использовать и ассоциативный массив.
Используйте шаблон объявления и ориентируйтесь по цветам:
Красным
– массивы.
Коричневым
– числовая переменная.
Синим
– константа.
Уважаемый (ая), Иван Иванович
!
Приглашаем Вас на день открытых дверей
.
Дата события: 12
мая.
С уважением, Василий.
Дополните код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // объявление константы
define
("SIGN"
,
"С уважением, Вася"
)
;
// массив для имен адресатов
$names
=
array
(...
)
;
// массив для событий
$events
=
array
(
"op_doors"
=>
"день открытых дверей"
,
"vistavka"
=>
"выставку"
,
...
)
;
$str
=
"Уважаемый(ая), $names
! " ; $str .= ...; $str .= ...; echo ...; |
// объявление константы
define("SIGN","С уважением, Вася");
// массив для имен адресатов
$names = array(...);
// массив для событий
$events = array("op_doors" => "день открытых дверей",
"vistavka" => "выставку",
...);
$str = "Уважаемый(ая), $names!
";
$str .= ...;
$str .= ...;
echo ...;
Необходимо перебрать по очереди и обработать все или некоторые эле-
менты массива.
Решение
Используйте оператор foreach:
Foreach ($array as $value) {
// Действие с $value
}
Или для получения ключей и значений массива:
Foreach ($array as $key => $value) {
// Действие II
}
Другим способом является применение оператора for:
for ($key = 0, $size = count($array); $key
// Действие III
}
И наконец, можно использовать функцию each() в комбинации с функцией list() и оператором while:
Reset($array) // сброс внутреннего указателя в начало массива
while (list($key, $value) = each ($array)) {
// Окончательное действие
}
Обсуждение
Цикл foreach – это наипростейший способ выполнения итераций с массивом:
// оператор foreach со значениями
foreach ($items as $cost) {
...
}
// оператор foreach с ключами и значениями
foreach($items as $item => $cost) {
...
}
В операторе foreach PHP перебирает не исходный массив, а его копию.
Напротив, при использовании функции each() и оператора for, PHP перебирает оригинальный массив. Поэтому, если внутри цикла происходит модификация массива, то можно получить (а можно и не получить) ожидаемое поведение.
Если необходимо изменить массив, то используйте прямую ссылку на него:
Reset($items);
while (list($item, $cost) = each($items)) {
if (! in_stock($item)) {
unset($items[$item]); // непосредственная адресация массива
}
}
Переменные, возвращаемые функцией each(), не ссылаются на исходные значения массива
– это их копии, поэтому их изменение не отражается на массиве. Вот почему нужно модифицировать переменную $items[$item] вместо переменной $item.
При использовании функции each() PHP отслеживает и запоминает положение внутри цикла. Чтобы начать цикл сначала после выполнения первого прохода, нужно вызвать функцию reset() для того, чтобы вернуть указатель обратно в положение перед циклом. В противном
случае функция each() вернет значение false.
Цикл for работает только в случае массивов с последовательными целыми ключами. Если длина массива не изменяется, то неэффективнопри каждом прохождении цикла снова вызывать функцию count() для вычисления переменной $items.
Поэтому для хранения длины массива всегда используйте переменную $size:
For ($item = 0, $size = count($items); $item
...
}
Если вы предпочитаете в целях разумной экономии использовать одну
переменную, то считайте в обратном направлении:
for ($item = count($items) - 1; $item >= 0; $item--) {
...
}
Ассоциативная версия цикла for:
For (reset($array); $key = key($array); next($array)) {
...
}
Это приведет к ошибке, если какой-нибудь элемент содержит строку со значением, приравненным к false, поэтому вроде бы нормальное значение, такое как 0, может привести к досрочному завершению цикла.
Наконец, используйте функцию array_map() для передачи каждого элемента обрабатывающей функции:
// переводим все слова в нижний регистр
$lc = array_map("strtolower", $words);
Первым аргументом функции array_map() является имя функции, которая модифицирует отдельный элемент, а второй аргумент – это массив, обрабатываемый в цикле.
Как правило, эти функции считаются менее гибкими, по сравнению с ранее рассмотренными методами, но они хорошо подходят для обработки и объединения множества массивов.
Если не известно, должны ли обрабатываться данные как скалярные величины или как массив, то необходимо предотвратить использование оператора foreach с не массивом. Один из способов – это применение функции is_array():
If (is_array($items)) {
// код с циклом foreach для массива
} else {
// код для скалярной величины
}
Другим способом является принудительное преобразование всех переменных в массив с помощью функции settype():
Settype($items, "array");
// код цикла для массивов
Это превращает скалярное значение в одноэлементный массив и делает код более привлекательным за счет небольших дополнительных накладных расходов.
(массив в массиве, матрица)
5. Функции для работы с массивами (массив в массиве, матрица)
Что такое массив PHP?
Начать данную тему хотелось бы с отречённых примеров. Допустим, мы рассматриваем какого-либо человека . У него есть имя, фамилия, адрес, телефон, пол, рост, цвет глаз и так далее. Информацию по всем этим пунктам можно отнести к массиву данных о человеке.Массив может быть другого типа, без какой-либо конкретики по пунктам. Будет только тема. Допустим, это web-прграммирование . А в качестве элементов будут языки - HTML , CSS , JavaScript , PHP , MySQL . Всего 5 элементов.
Исходя из последнего примера предположим массив:
web-программирование
1. HTML
2. CSS
3. JavaScript
4. PHP
5. MySQL
Теперь смотрим на данный пример и анализируем основные понятия.
Массив в PHP - это набор последовательно расположенных однотипных данных, связанных общей тематикой, число элементов которого фиксировано.
Массив в данном примере будет называться web-программирование .
У каждого элемента есть своё порядковое место, идентификатор.
Индекс
(ключ массива) - либо порядковый номер, либо текстовое значение, по которому можно идентифицировать элемент.
Индексами в примере выше будут числовые значение от 1 до 5 . При обращении к индексу 2 мы увидим CSS.
Пример массива в PHP
Теперь давайте рассмотрим вышеуказанный пример в синтаксисе PHP, а не русского языка. Допустим массив будет называться короче - web . В квадратных скобках будет вставлять индекс.Давайте рассмотрим простой пример массива, где в значении индексов будут числовые значения, а создавать массив будем так, словно переменным присваиваем значения.
$web="HTML";
$web="CSS";
$web="JavaScript";
$web="PHP";
$web="MySQL";
$web; // данная переменная содержит массив с 5-ю элементами
// чтобы вывести один из элементов массива достаточно указать индекс в массиве
echo $web; // выведет PHP
Одномерный массив
ИНДЕКСНЫЙ МАССИВВыше, с web-программированием, мы рассмотрели как раз пример одномерного массива.
Таким способом он создаётся редко. Он скорее наглядно показывает структуру массива. Чаще прибегают к другому методу.
$web=array("HTML","CSS","JavaScript","PHP","MySQL");
echo $web; // выведет "HTML"
echo $web; // выведет "JavaScript"
echo $web; // выведет "PHP"
Если Вы хотите задать значения индекса, то их надо указать следующим образом. Знак =>
является указателем для присваивания индекса значению или наоборот значению индекс.
$web=array(1=>"HTML",2=>"CSS",3=>"JavaScript",4=>"PHP",5=>"MySQL");
echo $web; // HTML
echo $web; // CSS
echo $web; // PHP
В примере отсчёт начинается с 1. Переменная с индексом 0 вследствие этого пустая.
В следующем примере мы не будем указывать индекс.
$day="Понедельник"; // индекс 0
$day="Вторник"; // 1
$day="Среда"; // 2
$day="Четверг"; // 3
$day="Пятница"; // 4
Можно проследить, что происходит последовательное заполнение с нуля.
АССОЦИАТИВНЫЙ МАССИВ
Зачастую возникает потребность в создании буквенного индекса для элемента массива. Как я упоминал выше, такой индекс должен состоять из латинских букв, а имя должно быть заключено в кавычки. Рассмотрим на примере человека.
$user["nick"]="Logic";
$user["name"]="Павел";
$user["age"]="25";
$user["sex"]="Мужской";
$user; // переменная $user содержит массив с 4-мя элементами с буквенными индексами
// выводим элемент массива, указывая его буквенный индекс
echo $web["name"]; // выведет "Павел"
Как видите, всё достаточно просто. Только значение индекса закавычиваем.
Двумерный массив
Если Вы пропустили первую часть с Одномерным массивом , то настоятельно советую прочитать.Если говорить проще, то это массив в массиве. То есть элементов большого массива является другой. Подобные массивы очень тормозят работу скрипта, загружая оперативную память, поэтому для быстрой обработки подобных групп данных созданы Базы Данных (Что такое База данных?), но о ней позже. Давайте разберём пример двумерного массива.
// массив с названиями Частей Света
$m = array("Европа","Азия","Африка","Америка","Австралия и Океания");
// массив с названиями Стран
$s = array("Россия","Украина","Беларусь","Казахстан");
// массив с названиями Столиц
$с = array("Москва","Киев","Минск","Астана");
// создаём двумерный массив География
$geography = array($m, $s, $с);
?>
Во включенных массивах, как Вы обратили внимание, может быть разное количество элементов. Из части про одномерные массивы следовало, что у каждого элемента массива может быть индекс. Так давайте для каждого включённого массива присвоим своё значение.
Для этого расширим последнюю строчку и напишем её следующим образом.
$geography = array("Части Света"=>$m, "Страны"=>$s, "Столицы"=>$с);
Функции работы с массивами php
Foreach - циклическая функция для работы с массивами, в которой количество циклов равно количеству элементов массива.Имеет следующий вид. Код PHP
Foreach (массив as $ключ=>$значение)
команды;
Ну и сразу пример работы
// создаём массив со знаменитыми IT
$names["Ритчи"] = "Деннис";
$names["Томпсон"] = "Кен";
$names["Гейтс"] = "Билл";
$names["Джобс"] = "Стив";
Foreach ($names as $key => $value) {
echo "$value $key";
}
?>
На экран скрипт выведет
Деннис Ритчи
Кен Томпсон
Билл Гейтс
Стив Джобс
Count
- функция, возвращающая количество элементов в массиве.
Echo count($names); // в нашем примере с IT вернёт значение 4
Sort
- функция, сортирующая элементы массива. Удобна в случае числовых значений индекса.
Arsort
- функция, сортирующая элементы массива в обратном порядке.
Sort($names); // сортирует по порядку. Удобно если в Индексе числа
arsort($names); // сортировать в обратном порядке. То есть по индексам элементы будут в порядке 3, 2, 1, 0
Unset
- функция, удаляющая элемент массива.
Unset($massiv); // удаление элемента массива с индексом 2
unset($massiv); // удаление массива целиком
Array_search
- функция поиска в массиве. Имеет два аргумента. Проще говоря, имеет вил array_search("что", где)
$animals="dog";
$animals="cat";
$animals="bird";
echo array_search("cat",$animals); // выведет индекс элемента - цифру 2
Shuffle
- функция, которая перемешивает ключи значений массива.
Shuffle($animals); // выстроит элементы в случайном порядке
Спасибо за внимание!
$arr
[
1
] =
"PHP"
;
$arr
[
2
] =
"MySQL"
;
$arr
[
3
] =
"Apache"
;
?>
Элементы массива можно использовать в двойных кавычках как обычные переменные, так код
echo
"$arr $arr $arr"
;
?>
$arr
[
"first"
] =
"PHP"
;
$arr
[
"second"
] =
"MySQL"
;
$arr
[
"third"
] =
"Apache"
;
?>
В этом случае массив называется ассоциативным , а его индексы называются ключами . Для вывода элемента массива в строке кавычки (ни двойные, ни одинарные) указывать не следует:
echo
"$arr $arr $arr"
;
?>
Так как у ассоциативных массивов нет индексов, для обхода их введён специальный вид цикла - foreach :
foreach($arr
as
$key
=>
$value
)
{
echo
"$key =
$value
"
;
}
?>
В результате работы цикла будет выведено три строки
first = PHP
second = MySQL
third = Apache
Конструкция "$key =>", позволяющая получить доступ к ключу массива на каждом из циклов является не обязательно и может быть опущена:
foreach($arr
as
$value
)
{
echo
"$value
"
;
}
?>
Ряд функций, также позволяют возвращать массивы, например, функция file() , которая читает файл и возвращает его содержимое в виде массива. Каждый элемент массива соответствует одной строке.
$arr
=
file
("text.txt"
);
for($i
=
0
;
$i
<
count
($arr
);
$i
++)
{
echo
$arr
[
$i
].
"
"
;
}
?>
Другой полезной функцией является функция explode() , которая позволяет разбить строку на несколько фрагментов, каждый из которых помещается в отдельный элемент массива:
$str
=
"345|[email protected]|http://www.softtime.ru|login|password"
;
$arr
=
explode
("|"
,
$str
);
for($i
=
0
;
$i
<
count
($arr
);
$i
++)
{
echo
$arr
[
$i
].
"
"
;
}
?>
Результат работы скрипта может выглядеть следующим образом:
345
[email protected]
http://www.softtime.ru
login
password
Существует и обратная функция - implode(), которая объединяет, элементы массива в строку, используя для этого заданный разделитель:
$arr
=
"345"
;
$arr
=
"[email protected]"
;
$arr
=
"http://www.softtime.ru"
;
$arr
=
"login"
;
$arr
=
"password"
;
$str
=
implode
("##"
,
$arr
);
echo
$str
;
//345##[email protected]##http://www.softtime.ru##login##password
?>
Замечание
Вообще функций, которые потрошат строку превеликое множество, рассмотрение всех их выходят за рамки данной статьи.
Удалить отдельный элемент массива можно при помощи функции unset() , а проверить существование массива можно при помощи функции isset() . Определим массив из 10 элементов и уничтожим каждый чётный элемент.
unset($arr
[
0
],
$arr
[
2
],
$arr
[
4
],
$arr
[
6
],
$arr
[
8
]);
// Проверяем существуют ли элементы массива
for($i
=
0
;
$i
<
10
;
$i
++)
{
if(isset($arr
[
$i
])) echo
"Элемент $arr[$i] определён
"
;
else echo
"Элемент $arr[$i] не определён
"
;
}
?>
Результатом работы скрипта из будут следующие строки
Элемент $arr не определён
Элемент $arr определён
Элемент $arr не определён
Элемент
$arr определён
Элемент $arr не определён
Элемент $arr
определён
Элемент $arr не определён
Элемент $arr определён
Элемент $arr не определён
Элемент $arr определён
При помощи функции unset() можно уничтожить весть массив сразу.
$arr
= array(9
,
8
,
7
,
6
,
5
,
4
,
3
,
2
,
1
,
0
);
unset($arr
);
if(isset($arr
)) echo
"Массив определён"
;
else echo
"Массив не
определён"
;
?>
До этого массивы выводились при помощи цикла, однако в PHP предусмотрена специальная функция для вывода дампа массива print_r() . Функция ориентирована на вывод в консольный поток, поэтому при выводе результатов в окно браузера лучше обрамить её тэгами
И:
$arr = "345";
$arr =
"[email protected]";
$arr = "http://www.softtime.ru";
$arr =
"login";
$arr = "password";
echo "
";";
print_r($arr);
echo "
?>
Результат работы скрипта выглядит следующим образом:
Array
=> 345
=> [email protected]
=>
http://www.softtime.ru
=> login
=> password
)
Многомерные массивы
В качестве элементов массива могут выступать не только скалярные величины, но и сами массивы. В этом случае получаются так называемые многомерные массивы.
Пусть необходимо получить такую таблицу:
Для этого создадим двумерный массив:
$arr
= array(array(‘Вася’
,
‘слесарь’
,
2500
),
array(‘Миша’
,
’строитель’
,
3000
),
array(‘Андрей’
,
‘шофер’
,
2700
));
?>
Теперь таблицу можно вывести при помощи следующего кода:
for ($i
=
0
;
$i
<
3
;
$i
++)
{
for
($j
=
0
;
$j
<
3
;
$j
++)
{
echo
" | "
.
$arr
[
$i
][
$j
];
}
echo
"
"
;
}
?>
Результат:
| Вася | слесарь | 2500
|
Миша | строитель | 3000
| Андрей | шофер | 2700
Также можно использовать трехмерные, четырехмерные и т.п. массивы.
Операции над массивами (сборник рецептов)
1) Определения числа элементов в массиве count() :
Создадим массив $name:
?>
Чтобы определить число элементов в массиве можно поступить следующим образом:
echo
‘Число элементов в массиве
-
’
.
count
($name
);
?>
Результат:
Число элементов в массиве – 8
2) Объединение массивов
a) Создадим два ассоциативных массива $a и $b:
$a
= array(“a”
=>
”aa”
,
“b”
=>
“bb”
);
$b
=
array(“c”
=>
”cc”
,
“d”
=>
“dd”
);
?>
Пусть необходимо создать массив $c, которые будет содержать как элементы массива $a так и массива $b:
$a
= array("a"
=>
"aa"
,
"x"
=>
"xx"
);
$b
=
array("c"
=>
"cc"
,
"d"
=>
"dd"
);
$c
=
$a
+
$b
;
echo
"
" ;" ;
print_r ($c );
echo "
?>
Результат:
Array
[a] => aa
[x]
=> xx
[c] => cc
[d] => dd
)
b) Создадим два числовых массива $a и $b:
$a
= array(10
,
20
);
$b
= array(100
,
200
,
300
,
400
,
500
);
?>
Их уже не получится объединить при помощи конструкции $c = $a + $b;. Для их объединения потребуется воспользоваться функцией array_merge() :
$c
=
array_merge
($a
,
$b
);
?>
3) Сортировка массива
Воспользуемся массивом $name:
$name
= array("Boss"
,
"Lentin"
,
"NAV"
,
"Endless"
,
"Dragons"
,
"SiLeNT"
,
"Doctor"
,
"Lynx"
);
?>
Пусть требуется отсортировать массив в алфавитном порядке, для этого можно воспользоваться следующим кодом:
sort
($name
);
echo
"
" ;" ;
print_r ($name );
echo "
?>
Результат:
Array
=> Boss
=> Doctor
=> Dragons
=> Endless
=> Lentin
=> Lynx
=> NAV
=> SiLeNT
)
Пусть необходимо из массива $name выбрать самый короткий элемент(у которого наименьшее количество символов), в этом случае можно воспользоваться кодом:
$name
= array("Boss"
,
"Lentin"
,
"NAV"
,
"Endless"
,
"Dragons"
,
"SiLeNT"
,
"Doctor"
,
"Lynx"
);
$min
=
strlen
($name
[
0
]);
$nam
=
$name
[
0
];
for ($i
=
1
;
$i
<
count
($name
);
$i
++)
{
$len
=
strlen
($name
[
$i
]);
if ($len
<
$min
)
{
$nam
=
$name
[
$i
];
$min
=
strlen
($nam
);
}
}
echo
"Наименьшая длина -
"
.
$nam
;
?>
4) Перемещение внутри массива
Создадим массив $num:
?>
Пусть требуется отобразить элементы массива в обратном порядке, в этом случае можно воспользоваться кодом:
$end
=
end
($num
);
While
($end
)
{
echo
$end
.
"
- "
;
$end
=
prev
($num
);
}
?>
Результат:
10 - 9 - 8 - 7 - 6 - 5 - 4 - 3 - 2 – 1
Приведённый выше код можно модифицировать:
$num
=
range
(1
,
10
);
print_r
(array_reverse
($num
));
?>
Функция range(1,10) создает массив (1,2,3,4,5,6,7,8,9,10) со случайным расположением элементов. Функция array_reverse() принимает массив и располагает элементы в обратном порядке (10,9,8,7,6,5,4,3,2,1)
Функции next() , each() перемещают указатель на один элемент вперед. Функция reset() возвращает указатель на 1 элемент в массиве. Воспользуемся массивом $num:
$num
= array(1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
10
);
?>
Пусть необходимо вывести все элементы по порядку, и на последнем элементе массива вернуть указатель на первый элемент массива. Эту операцию можно осуществить при помощи следующего кода.
Доброго времени суток, хабражители!
В своей статье я хочу поговорить об обработке многомерных ассоциативных массивов в PHP. На мой взгляд, не всегда удобно получать необходимую информацию из многомерного массива. Одно дело если массив двумерный:
$array = array("dimension1" => array("key1" => "value1",
"key2" => "value2"));
?>
То, конечно, получить, интересующие нас значения, легко:
Echo $array["dimension1"]["key1"]; // value1
Но, а если мы имеем массив n-мерный? Например, пятимерный:
$array = array("dimension1" => array("dimension2" => array("dimension3" => array("dimension4" => array("dimension5" => array("value1" => "Hey! I\"m value1", "value2" => "Hey! I\"m value2"))))));
То, чтобы получить значение по ключу, например, «value1», нам надо прописать такой код:
Echo $array["dimension1"]["dimension2"]["dimension3"]["dimension4"]["dimension5"]["value1"]; // Hey! I"m value1
Я такую запись не назвал бы красивой, хотя она является правильной. Я предлагаю слегка сделать эту запись красивой путем приведения ее к такому виду:
Echo easyA($array)->dimension1->dimension2->dimension3->dimension4->dimension5->value1; // Hey! I"m value1
Согласитесь, ведь смотрится, действительно, куда симпотичней, по сравнению со стандартной записью.
Итак, для начала нам понадобится создать класс, который будет обрабатывать наш массив. Назовем его easyArray и сделаем его одиночкой (Singleton):
Код
class easyArray{
private static $instance; // Состояние класса.
private $Array; // Массив, который был передан классу.
private function __construct(){
// Запилили конструктор.
}
private function __clone(){
// Запилили метод клонирования.
}
public static function getInstance(){
if(null === self::$instance){
self::$instance = new self();
}
return self::$instance;
}
После того, как наш класс стал одиночкой, добавим ему весьма важный метод, который будет записывать полученный массив в приватную переменную:
Код
public function loadArray($newArray){
if(is_array($newArray)){
$this->Array = $newArray;
return $this;
}else{
$error = "К сожалению вы передали не массив.";
throw new Exception($error);
}
}
Из кода видно, что мы также осуществляем проверку того, что было передано на вход метода. В случае того, если был передан все-таки не массив, мы просто выбросим исключение с ошибкой "К сожалению вы передали не массив
.". Если проверка прошла успешно, то мы записываем в приватную переменную полученный массив и возвращаем текущий объект.
Ну а теперь мы переопределим магический метод "__get()" нашего класса. Это необходимо для того, чтобы получить желаемый нами результат. Итак:
Код
public function __get($index){ if(isset($this->Array[$index])){ if(is_array($this->Array[$index])){ $this->loadArray($this->Array[$index]); return $this; }else{ return $this->Array[$index]; } }else{ $error = "Отсутствует ключ (".$index.") в массиве"; throw new Exception($error); } }
Первым делом, мы проверяем наличие запрошенного ключа в массиве, в случае отсутствия такового, выбрасываем исключение с ошибкой ""Отсутствует ключ (".$index.") в массиве"
". Далее проверяем является ли, запрошенный ключ массивом. Если по такому ключу в массиве находится значение, то просто возвращаем это значение. А если все-таки это массив, то мы отправляем его методу "loadArray($newArray)
" и возвращаем текущий объект ($this).
И, как последний штрих нашего класса, добавим метод, который будет возвращать текущий массив, с которым работает наш класс:
Код
public function arrayReturn(){
return $this->Array;
}
Итак, наш класс готов, но чтобы получить значения, теперь мы должны использовать такой код:
Echo easyArray::getInstance()->loadArray($array)->dimension1->dimension2->dimension3->dimension4->dimension5->value1; // Hey! I"m value1
Стало даже длиннее, чем было. Но эта проблема решаема, и для этого нам понадобится простая функция:
Function easyA($newArray){ return easyArray::getInstance()->loadArray($newArray); }
Ну, а теперь проверим, что мы получили в итоге:
Код
$array = array("dimension1" => array("dimension2" => array("dimension3" => array("dimension4" => array("dimension5" => array("value1" => "Hey! I\"m value1",
"value2" => "Hey! I\"m value2"))))));
require_once("easyArray.php");
require_once("easyArrayFunction.php");
echo easyA($array)->dimension1->dimension2->dimension3->dimension4->dimension5->value1; // Hey! I\"m value1
echo easyA($array)->dimension1->dimension2->dimension3->dimension4->dimension5->value2; // Hey! I\"m value2
?>
Все работает, как и задумывалось.
Помимо этого, данному классу можно передавать конфигурационные файлы типа:
Код
return array("dimension1" => array("dimension2" => array("dimension3" => array("dimension4" => array("dimension5" => array("value1" => "Hey! I\"m value1 from file array.php",
"value2" => "Hey! I\"m value2 from file array.php"))))));
?>
Для этого необходимо использовать такую конструкцию:
Код
echo easyA(require_once("array.php"))->dimension1->dimension2->dimension3->dimension4->dimension5->value1; // Hey! I"m value1 from file array.php
Возможно я изобрел велосипед, но я думаю, что данная статья будет интересна, как новичкам, так и остальным программистам.
Спасибо за внимание.