Работа с массивами в PHP
Функций для работы с массивами в PHP достаточно много, и это неудивительно, если учесть, что с массивами при программировании приходится работать достаточно часто. И в этой статье мы разберём основные функции, которые создали для работы с массивами в PHP разработчики.
Для начала разберём простейшую функцию, которая проверяет находится ли элемент в массиве. Функция называется in_array():
<?php
$arr = array("Num", "Str", "Int");
if (in_array("Str", $arr)) echo "Элемент найден";
else echo "Элемент не найден";
?>
Как видно из примера, данная функция проверяет наличие первого параметра среди значений массива, заданного вторым параметром. И возвращает true, если элемент найден, либо false, если не был найден. Особо продвинутые спросят: "А как же быть с такими вещами, как 0 и false, ведь это разные значения, но PHP их считает одинаковыми?". Для этого в функции in_array() существует ещё третий параметр, необязательный, который если имеет значение true, то функция сверяет не только значения, но и типы:
<?php
$arr = array(0, "Str", "Int");
if (in_array(false, $arr, true)) echo "Элемент найден";
else echo "Элемент не найден";
?>
Ещё одна очень полезная функция - array_unique(), которая принимает массив и возвращает массив без дублирующихся значений:
<?php
$arr = array(3, 5, "Val", 3, "Val", 7);
$arr_uniq = array_unique($arr);
print_r($arr_uniq);
?>
Как можно заметить, запустив скрипт, в получившемся массиве нет повторяющихся значений.
Очень важные функции - это функции извлечения части массива из исходного (аналог функции substr(), только она для строк):
<?php
$arr = array(12, 10, 15, "Name", "Some", -0.5);
$arr_2 = array_slice($arr, 3);
print_r($arr_2);
?>
Эта функция принимает два параметра: исходный массив и номер элемента, с которого должен начаться новый массив (напоминаю, что нумерация начинается с нуля). Как видно, новый массив будет от элемента, номер которого задан во втором параметре и до конца исходного массива. Также если добавить третий параметр, то можно задать длину нового массива:
<?php
$arr = array(12, 10, 15, "Name", "Some", -0.5);
$arr_2 = array_slice($arr, 3, 2);
print_r($arr_2);
?>
В результате, Вы увидите: "Array ( [0] => Name [1] => Some )".
Теперь перейдём к последней группе функций - функциям сортировки массивов. Но для начала напоминаю разницу между списками и ассоциативными массивами. Список - это массив, у которого индексами являются числа, которые упорядочены по возрастанию, начиная с 0. А ассоциативный массив - это массив, у которого индексами является, вообще говоря, строки, которые называются ключами. Почему это так важно при сортировке? Если Вы сортируете список, то Вам совершенно не важно, чтобы сохранялась связка: "ключ - значение", так как индексы не служат для идентификации значения, а служат лишь для обращения к нему. А в ассоциативном массиве первостепенное значение имеет именно связка: "ключ-значение", поэтому необходимо, чтобы при сортировке она сохранялась.
Давайте начнём с простого: сортировки списков. Для этого существуют функции sort() и rsort(). Первая функция сортирует массив по возрастанию, а вторая по убыванию:
<?php
$arr = array(15, 12, "String", 40, -2, 0, 12);
sort($arr);
print_r($arr);
echo "<br />";
rsort($arr);
print_r($arr);
?>
Думаю, что здесь всё понятно.
Теперь перейдём к функциям сортировки ассоциативных массивов: asort() и arsort(). Делают они всё тоже самое, но связь "ключ-значение" сохраняется:
<?php
$arr = array("Name" => "Tommy", "Age" => "34", "Level" => "15");
asort($arr);
print_r($arr);
echo "<br />";
arsort($arr);
print_r($arr);
?>
Теперь давайте рассмотрим функции сортировки по ключам ассоциативных массивов: ksort() и krsort():
<?php
$arr = array("Name" => "Tommy", "Age" => "34", "Level" => "15");
ksort($arr);
print_r($arr);
echo "<br />";
krsort($arr);
print_r($arr);
?>
Уверен, что здесь всё прозрачно. А если что-то непонятно, то запустите скрипт, и проанализируйте результат.
И, напоследок, рассмотрим функции пользовательской сортировки: uasort() и uksort(). Обе функции принимают два параметра: массив и пользовательскую функцию сортировки. Функция сортирует массив по значениям, а функция uksort() сортирует массив по ключам. В качестве примера рассмотрим такой скрипт:
<?php
function cmp($x, $y) {
if ($x == $y) return 0;
if ($x == 1) return 1;
if ($y == 1) return -1;
if ($x > $y) return 1;
else return -1;
}
$arr = array("A" => 1, "C" => 3, "B" => 2);
uasort($arr, "cmp");
print_r($arr);
echo "<br />";
uksort($arr, "cmp");
print_r($arr);
?>
Как видите, мы написали свои правила сортировки, по которым число "1" всегда больше любого другого значения. Если ни одно из чисел не является "1", то тогда сравниваем по обычным правилам. Таким образом, PHP сортирует наш массив по правилам, описанным в функции сравнения, название которой мы передали в функциях uasort() и uksort().
Вот и все основные функции для различных манипуляций с массивами. Разумеется, это далеко не все, которые сделали для нас разработчики, но эти функции действительно важные, и на практике применяются регулярно.
-
- Михаил Русаков
Комментарии (25):
В последнем примере два раза повторяется функция uasort, похоже опечатка: $arr = array("A" => 1, "C" => 3, "B" => 2); uasort($arr, "cmp"); print_r($arr); echo "<br />"; uasort($arr, "cmp"); print_r($arr);
Ответить
Во втором случае должно быть uksort(). Исправил, спасибо!
Ответить
а вы за какой срок научились работать с php?
Ответить
За пару дней его освоил (поскольку это был уже далеко не первый язык), а вот дальше развиваюсь по сей день.
Ответить
у меня что то не больно развивается! теряюсь,путаюсь
Ответить
и не могу разобраться с этим Array ( [0] => 3 [1] => 5 [2] => Val [5] => 7 ) чем то похоже на отладку!
Ответить
Это и есть отладочная функция print_r. Просто так легче написать и смысл функции от этого не меняется. Но если для Вас это важно, то вы можете использовать циклы и вывести всё красиво:)
Ответить
ВОТ! Пользуйтесь на здоровье:) $arr = array(3, 5, "Val", 3, "Val", 7); $arr_uniq = array_unique($arr); for($i = 0; $i < count($arr_uniq); $i++) { echo $arr_uniq[$i]."<br />"; }
Ответить
привет,сделал вот такой вот запрос($result = mysql_query("SELECT title,meta_d,meta_k,text FROM war13 WHERE page='index'",$db),все из таблицы вывелось,но с кракозябрами ??????????.файл htaccess создан, в нем все прописал как положено.при создание таблицы поставил кодировку utf-8 general-ci.сам сайт тоже на utf-8.в чем может быть проблема?спасибо.
Ответить
http://myrusakov.ru/php-encoding-problems.html
Ответить
Здравсвуйте, Михаил! Помогите, как посчитать сумму всех значений [votes]? :Array ( [0] => Array ( [id] => 1 [poll_id] => 1 [title] => Вариант один [votes] => 510 ) [1] => Array ( [id] => 2 [poll_id] => 1 [title] => Вариант 2 [votes] => 201 ) [2] => Array ( [id] => 3 [poll_id] => 1 [title] => Вариант 3 [votes] => 353 ) )
Ответить
for ($i = 0; $i < count($arr); $i++) $summa += $arr[$i]["votes"];
Ответить
А можно ли теперь как то прям в этом цикле использовать $summa? Ну то есть конечное число суммы которое получилось? В цикле просто получается вывод трех чисел с этой переменной: первое, сумма первого и второго, сумма всех...
Ответить
После цикла надо использовать $summa.
Ответить
Да я понял... Мне просто нужно решить такую задачу: в даном случае вывести процент проголосовавших с опроса, как у Вас на сайте. А для этого нужно количество голосов каждого варианта ответа в цикле делить на общую сумму всех голосов и умножить на 100. Как же мне это реализовать...
Ответить
Сделать второй цикл, где уже считать проценты.
Ответить
Все получилось!!! Спасибо Вам большое!!!!
Ответить
Михаил, помогите пожалуйста! Мне нужно сделать авторизацию пользователей из файла... Есть такой код: $login = htmlspecialchars($_POST["login"]); $password = htmlspecialchars($_POST["password"]); $string = file_get_contents("users.txt"); $array = explode("\n", $string); Нужно как то $login.$password сравнить с на соответствие со значением массива $array... и если все прошло успешно, выполнять определенные действия. Заранее спасибо)
Ответить
И в чём проблема? Сравнение происходит с помощью ==.
Ответить
Да это понятно... просто я что то запутался, это в цикле нужно сравнивать?
Ответить
Всё зависит от содержимого файла, в каком оно формате. Затем нужно получить такой же формат у входных данных, а после через цикл искать совпадение, и если оно найдено, значит, данные введены верно.
Ответить
Михаил, я вот пытаюсь решить выше-описанную задачу следующим образом: if (in_array($login.$password, $array)) echo"совпадение есть"; else"совпадений нет"; Почему то не получается ничего, хотя в файле данные записаны в таком же формате... Не подскажете в чем ошибка? Заранее большое спасибо.
Ответить
http://myrusakov.ru/php-finderror.html - используйте этот метод для поиска ошибок.
Ответить
Миша, скажи, как мне изучать php, чтоб запоминать все? Я делаю так: подряд все твои статьи прочитываю, потом делаю у себя то, о чем написано и перехожу к следующему. Но потом я все это забываю.
Ответить
http://myrusakov.ru/php-how-study.html
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.