Создание и перебор массивов в PHP
Пришло время разобраться с ещё одним типом переменных в PHP - массивами. Массив - это тип переменной, который может содержать множество значений, причём даже разных типов. И этой статье мы поговорим о создании и переборе массивов в PHP.
Создать массив в PHP очень просто:
<?php
$arr = array(15, 14, true, "ds", -0.5);
echo $arr[0]."<br />";
echo $arr[3];
?>
Здесь мы создали массив, в котором находится пять значений. Обратите внимание, что типы переменных различны. На следующих двух строках мы выводим два элемента из этого массива. Очень важно: нумерация начинается с 0! То есть первый элемент имеет индекс 0, второй - 1 и так далее.
На самом деле, в предыдущем примере мы создавали не массив, а, скорее, список. Список - это тот же массив, но с числовыми индексами, идущими по порядку (то есть 0, 1, 2, 3 и так далее). А теперь создадим именно массив (его ещё называют ассоциативный массив):
<?php
$arr = array("Name" => "Tom", "Age" => 14);
echo $arr["Name"]."<br />";
echo $arr["Age"];
?>
Здесь мы создали массив не с числовым индексом, а с так называемыми ключами. Ключами в массиве являются: "Name" и "Age". У каждого ключа имеется значение "Tom" и 14 соответственно. Думаю, здесь вопросов не возникает.
А теперь разберём перебор массива. Первый массив (который список) перебирается элементарно:
<?php
for ($i = 0; $i < count($arr); $i++)
echo $arr[$i]."<br />";
?>
Здесь просто идёт цикл for от 0 до длины массива и при каждой итерации выводится элемент массива.
А как же быть с ассоциативными массивами, ведь там индексы не числовые, как их перебирать? Для этого существует цикл foreach, который перебирает массив по ключам:
<?php
foreach ($arr as $k=>$v)
echo "$k - $v<br />";
?>
Думаю, что синтаксис понятен: $k - это ключ, а $v - соответствующее значение, и в этом массиве поочерёдно перебираются все пары в массиве, а потом выводятся. Разумеется, с помощью foreach можно также перебирать и списки.
В этой статье мы с Вами разобрали создание списков и массивов, а также я показал Вам как делать перебор всех значений, используя классическую конструкцию for и очень полезную и простую конструкцию foreach.
-
- Михаил Русаков
Комментарии (22):
Здравствуйте, Михаил, хочу поинтересоваться у Вас по поводу перебора следующего массива списка: for ($i=0;$i<=5;$i++) или for ($i=0; $i<count($arr); $i++). Есть ли существенная разница кроме как что в первом случае необходимо подсчитывать элементы списка, а во втором достаточно вписать только ограничитель массива? Первый вариант более компактный.
Ответить
Использовать надо второй вариант, так как данный перебор будет универсальным. А задача программиста делать, как можно меньше частного, и как можно больше общего.
Ответить
хочу вывести к примеру слово привет 10 раз.. скажите, вот так можно делать?? $str = 'привет'; for ($i=1; $i<=10; $i++){ echo $str.'<br>'; }
Ответить
Если это работает, то, да, можно.
Ответить
Михаил, добрый день! Подскажите, пожалуйста, как можно вытащить максимальный элемент из массива, чтобы показать не только сам элемент, но и его номер? У меня два массива (строки), выполняю деление элементов одного на элементы другого и ввожу результаты в третий массив. Теперь нужно выбрать максимальный и показать его значение и порядковый номер. Попробовал след. алгоритм: for ($i = 0; $i < count($indicator1); $i++) for ($i = 0; $i < count($hum1); $i++) $maxarr[$i]=$indicator1[$i]/$hum1[$i]."<br/>";// делим индикатор на численность $max=0; $sz=sizeof($maxarr); for($i=0;$i<$sz;$i++) if($maxarr[$i] > $max) $max=$maxarr[$i]; $maxI=$i; echo $max; echo $maxI; Выводится только показатель, а его порядковый номер нет. Спасибо! Михаил, и еще один вопрос. Подскажите, как вывести элементы массива, чтобы их порядковые номера начинались с 1. Т.е. arr[0] выводился бы на экран как первый элемент. Спасибо!
Ответить
if($maxarr[$i] > $max) $max=$maxarr[$i]; $maxI=$i; - фигурных скобок не хватает, 2 же оператора. На второй вопрос ответ - по-хорошему никак, и это правильно, поскольку гораздо удобнее нумерация с 0. Если же нужно с 1, то и инициализируйте постоянно массивы с 1 (вручную), и все циклы также с 1 начинайте, а не с 0.
Ответить
Михаил, спасибо! Вроде все получилось! Внимательность, и еще раз внимательность! По второму вопросу: что означает инициализировать постоянно вручную? Не совсем понял. Как его объявлять и присваивать данные? Спасибо!
Ответить
Это значит, что указывать индекс постоянно. $array[] - вот так не получится, поэтому нужно указывать в первый раз $array[1], а уже потом можно и $array[].
Ответить
Михаил, добрый день! Спасибо за ответ. Скажите, как подсчитать сумму элементов массива? Нашел функцию sum_array, но почему то не работает. Спасибо!
Ответить
Сумму элементов массива Вы должны сами научиться считать. Это простейшая задача, смысла делать что-то ещё нет, пока Вы её не решите. Поэтому подумайте сами.
Ответить
Согласен с вами полностью! Задача начального уровня (куда я и отношусь) Я решил ее следующим образом: $sum = $sum + $hum3[i]; вложил в цикл for. Но мне интересна именно отдельная функция. Это же легче. Не надо вводить переменную. Сразу выводишь на печать. Существует ли такая функция? Спасибо!
Ответить
array_sum() - функция, возвращающая сумму элементов массива.
Ответить
Михаил, спасибо! Еще немножко помучаю вас :)! Скажите, существуют ли в php готовые функции например расчета коэффициента корреляции или необходимо писать алгоритм? Я пока баклажан в php, но не хотелось бы изобретать велосипед.
Ответить
Таких функций точно нет, это не Statistica и даже не Matlab. Поэтому нужно писать это самому.
Ответить
Миш, очень прошу помоги... Есть массив: $element = array( 'banana.png' => 'Банан', 'kiwi.png' => 'Киви', 'apricot.png' => 'Абрикос', 'lemon.png' => 'Лимон', 'mango.png' => 'Манго', 'peach.png' => 'Персик', 'strawberry.png' => 'Клубнику', 'cherry.png' => 'Вишню', 'orange.png' => 'Апельсин', 'pear.png' => 'Грушу', ); Нужно выбрать 4 случайных элемента: $elements = array_rand($element, 4); но мне нужно сохранить значение ключа, делаю так но не выходит : foreach ($elements as $key => $value) { foreach ($element as $key1 => $value1) { $elements[$key1] = $value; } } print_r($elements); Помоги, очень прошу...
Ответить
Используйте функцию array_rand().
Ответить
Я ее и так использую, для выбора 4 случайных элементов, она очищает ключи, а мне нужно сохранить элементы в первоначальном состоянии. Как мне быть в такой ситуации?
Ответить
Она должна возвращать случайные ключи из массива, а не значения. А затем по этим случайным ключам уже можно получить и значения из исходного массива.
Ответить
Здравствуйте, Михаил. Есть ассоциативный массив, полученный из ini файла. Как можно сравнить значение ключей с переменной, используя цикл и при совпадение выйти из цикла?
Ответить
Всё как в этой статье. Просто сравниваете через условный оператор, и выходите из цикла через break в случае совпадения.
Ответить
Я правильно понял? Если в выборке из базы - $myrow[title] больше одной строки, то это уже "многомерный массив"? Тогда вопрос звучит так: как в многомерном массиве ($myrow2[title]) удалить записи (строки), которые уже есть в первом многомерном массиве ($myrow[title])? Или как вывести на экран все записи первого массива и записи со второго массива, которых нет в первом?
Ответить
Доброго времени суток Михаил! Помогите пожалуйста с массивом $x = array("один","два","три"); function getout($t) { if ($t == "один") return 1; elseif ($t == "два") return 2; elseif ($t == "три") return 3; } for ($i = 0; $i < 100; $i++ ) { $g[] = ($i * getout($x[$i % 3])); } print_r ($g); объясните пожалуйста вот эту строку $g[] = ($i * getout($x[$i % 3])); как она работает, что конкретно перемножается?
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.