Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Мова РНР.Питання до заліку.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

Создание/модификация с помощью синтаксиса квадратных скобок

Существующий массив может быть изменен явной установкой значений в нем.

Это выполняется присвоением значений массиву при указании в скобках ключа. Кроме того, вы можете опустить ключ, в этом случае добавьте к имени переменной пустую пару скобок ([]).

$arr[key] = value;

$arr[] = value;

// key может быть integer или string

// value может быть любым значением любого типа

Если массив $arr еще не существует, он будет создан. Таким образом, это еще один способ определить массив. Для изменения определенного значения просто присвойте элементу с его ключом новое значение. Если вы хотите удалить пару ключ/значение, вам нужно использовать функцию unset().

<?php $arr = array(5 => 1, 12 => 2); $arr[] = 56;    // В этом месте скрипта это                 // то же самое, что и $arr[13] = 56; $arr["x"] = 42; // Это добавляет к массиву новый                 // элемент с ключом "x"                  unset($arr[5]); // Это удаляет элемент из массива unset($arr);    // Это удаляет массив полностью ?>

Замечание:

Как уже говорилось выше, если ключ не был указан, то будет взят максимальный из существующих целочисленных индексов, и новым ключом будет это максимальное значение плюс 1. Если целочисленных индексов еще нет, то ключом будет 0 (ноль).

Учтите, что максимальное целое значение ключа не обязательно существует в массиве в данный момент. Оно могло просто существовать в массиве какое-то время, с тех пор как он был переиндексирован в последний раз. Следующий пример это иллюстрирует:

<?php // Создаем простой массив. $array = array(1, 2, 3, 4, 5); print_r($array); // Теперь удаляем каждый элемент, но сам массив оставляем нетронутым: foreach ($array as $i => $value) {     unset($array[$i]); } print_r($array); // Добавляем элемент (обратите внимание, что новым ключом будет 5, вместо 0). $array[] = 6; print_r($array); // Переиндексация: $array = array_values($array); $array[] = 7; print_r($array); ?>

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

Array

(

[0] => 1

[1] => 2

[2] => 3

[3] => 4

[4] => 5

)

Array

(

)

Array

(

[5] => 6

)

Array

(

[0] => 6

[1] => 7

)

Полезные функции

Для работы с массивами существует достаточное количество полезных функций. Смотрите раздел функции для работы с массивами.

Замечание:

Функция unset() позволяет удалять ключи массива. Обратите внимание, что массив НЕ будет переиндексирован. Если вы действительно хотите поведения в стиле "удалить и сдвинуть", можно переиндексировать массив используя array_values().

<?php $a = array(1 => 'один', 2 => 'два', 3 => 'три'); unset($a[2]); /* даст массив, представленный так:    $a = array(1 => 'one', 3 => 'three');    а НЕ так:    $a = array(1 => 'one', 2 =>'three'); */ $b = array_values($a); // Теперь $b это array(0 => 'one', 1 =>'three') ?>

Управляющая конструкция foreach существует специально для массивов. Она предоставляет возможность легко пройтись по массиву.

Что можно и нельзя делать с массивами

Почему $foo[bar] неверно?

Всегда заключайте в кавычки строковый литерал в индексе ассоциативного массива. К примеру, пишите $foo['bar'], а не $foo[bar]. Но почему? Часто в старых скриптах можно встретить следующий синтаксис:

<?php $foo[bar] = 'враг'; echo $foo[bar]; // и т.д. ?>

Это неверно, хотя и работает. Причина в том, что этот код содержит неопределенную константу (bar), а не строку ('bar' - обратите внимание на кавычки), и PHP в будущем может определить константу, которая, к несчастью для вашего кода, будет иметь то же самое имя. Это работает, потому что PHP автоматически преобразует "голую строку" (не заключенную в кавычки строку, которая не соответствует ни одному из известных символов языка) в строку, со значением этой "голой строки". Например, если константа с именем bar не определена, то PHP заменит bar на строку 'bar' и использует ее.

Замечание: Это не означает, что нужно всегда заключать ключ в кавычки. Нет необходимости заключать в кавычки константы или переменные, поскольку это помешает PHP обрабатывать их.

<?php error_reporting(E_ALL); ini_set('display_errors', true); ini_set('html_errors', false); // Простой массив: $array = array(1, 2); $count = count($array); for ($i = 0; $i < $count; $i++) {     echo "\nПроверяем $i: \n";     echo "Плохо: " . $array['$i'] . "\n";     echo "Хорошо: " . $array[$i] . "\n";     echo "Плохо: {$array['$i']}\n";     echo "Хорошо: {$array[$i]}\n"; } ?>

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

Проверяем 0:

Notice: Undefined index: $i in /path/to/script.html on line 9

Плохо:

Хорошо: 1

Notice: Undefined index: $i in /path/to/script.html on line 11

Плохо:

Хорошо: 1

Проверяем 1:

Notice: Undefined index: $i in /path/to/script.html on line 9

Плохо:

Хорошо: 2

Notice: Undefined index: $i in /path/to/script.html on line 11

Плохо:

Хорошо: 2

Дополнительные примеры, демонстрирующие этот факт:

<?php // Показываем все ошибки error_reporting(E_ALL); $arr = array('fruit' => 'apple', 'veggie' => 'carrot'); // Верно print $arr['fruit'];  // apple print $arr['veggie']; // carrot // Неверно. Это работает, но из-за неопределенной константы с // именем fruit также вызывает ошибку PHP уровня E_NOTICE // // Notice: Use of undefined constant fruit - assumed 'fruit' in... print $arr[fruit];    // apple // Давайте определим константу, чтобы продемонстрировать, что // происходит. Мы присвоим константе с именем fruit значение 'veggie'. define('fruit', 'veggie'); // Теперь обратите внимание на разницу print $arr['fruit'];  // apple print $arr[fruit];    // carrot // Внутри строки это нормально. Внутри строк константы не // рассматриваются, так что ошибки E_NOTICE здесь не произойдет print "Hello $arr[fruit]";      // Hello apple // С одним исключением: фигурные скобки вокруг массивов внутри // строк позволяют константам там находиться print "Hello {$arr[fruit]}";    // Hello carrot print "Hello {$arr['fruit']}";  // Hello apple // Это не будет работать и вызовет ошибку обработки, такую как: // Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING' // Это, конечно, также действует и с суперглобальными переменными в строках print "Hello $arr['fruit']"; print "Hello $_GET['foo']"; // Еще одна возможность - конкатенация print "Hello " . $arr['fruit']; // Hello apple ?>

Если вы переведете error_reporting в режим отображения ошибок уровня E_NOTICE (например, такой как E_ALL), вы сразу увидите эти ошибки. По умолчанию error_reporting установлена их не отображать.

Как указано в разделе синтаксис, внутри квадратных скобок ('[' и ']') должно быть выражение. Это означает, что можно писать вот так:

<?php echo $arr[somefunc($bar)]; ?>

Это пример использования возвращаемого функцией значения в качестве индекса массива. PHP известны также и константы:

<?php $error_descriptions[E_ERROR]   = "Произошла фатальная ошибка"; $error_descriptions[E_WARNING] = "PHP сообщает о предупреждении"; $error_descriptions[E_NOTICE]  = "Это лишь неофициальное замечание"; ?>

Обратите внимание, что E_ERROR - это такой же верный идентификатор, как и bar в первом примере. Но последний пример по сути эквивалентен такой записи:

<?php $error_descriptions[1] = "Произошла фатальная ошибка"; $error_descriptions[2] = "PHP сообщает о предупреждении"; $error_descriptions[8] = "Это лишь неофициальное замечание"; ?>

поскольку E_ERROR соответствует 1, и т.д.