Массивы в PHP. Работа с ключами массива и их значениями Php как получить названия ключей ассоциативного массива
arrays (13)
Начиная с PHP7.3 вы можете напрямую обращаться к последнему ключу (внешнему уровню) массива с помощью
Это означает, что вы можете получить значение конечного ключа без:
- перемещение указателя массива (для которого требуются две строки кода) или
- сортировка, реверсирование, выскакивание, подсчет, индексирование массива ключей или любого другого дурачества
Эта функция была долгожданной и приветливым дополнением к поясу инструмента функции массива, который повышает производительность, избегает нежелательных побочных эффектов и обеспечивает чистый / прямой / интуитивно понятный код.
$array = ["a" => "one", "b" => "two", "c" => "three"]; if (!function_exists("array_key_last")) { echo "please upgrade to php7.3"; } else { echo "First Key: " , key($array) , "\n"; echo "Last Key: " , array_key_last($array) , "\n"; next($array); // move array pointer to second element echo "Second Key: " , key($array) , "\n"; echo "Still Last Key: " , array_key_last($array); }
First Key: a Last Key: c // <-- unaffected by the pointer position, NICE! Second Key: b Last Key: c // <-- unaffected by the pointer position, NICE!
Некоторые примечания:
- array_key_last() - это функция sibling для array_key_first() .
- Обе эти функции являются «неосведомленными указателями».
- Обе функции возвращают значение null если массив пуст.
- Отброшенные функции брата (array_value_first() и array_value_last()) также предложили бы неосведомленный указателем доступ к элементам bookend, но они, очевидно, не смогли собрать достаточное количество голосов, чтобы ожить.
Вот некоторые релевантные страницы, посвященные новым функциям:
Как я могу получить последний ключ массива?
Решением было бы использовать комбинацию end и key (цитирования) :
- end() продвигает внутренний указатель массива к последнему элементу и возвращает его значение.
- key() возвращает индексный элемент текущей позиции массива.
Таким образом, часть кода, такая как эта, должна делать трюк:
$array = array("first" => 123, "second" => 456, "last" => 789,); end($array); // move the internal pointer to the end of the array $key = key($array); // fetches the key of the element pointed to by the internal pointer var_dump($key);
String "last" (length=4)
т.е. ключ последнего элемента моего массива.
После этого внутренний указатель массива будет находиться в конце массива. Как указано в комментариях, вы можете запустить reset() в массиве, чтобы вернуть указатель в начало массива.
Попробуйте использовать функции array_pop и array_keys следующим образом:
1, "two" => 2, "three" => 3); echo array_pop(array_keys($array)); // prints three ?>
Просто используйте: echo $array;
Вы можете использовать это:
$array = array("one" => "apple", "two" => "orange", "three" => "pear"); end($array); echo key($array);
Другое решение - создать функцию и использовать ее:
Function endKey($array){ end($array); return key($array); } $array = array("one" => "apple", "two" => "orange", "three" => "pear"); echo endKey($array);
Не знаю, будет ли это быстрее или нет, но это проще сделать так, и вы избегаете ошибки, не передавая функции end () ...
ему просто нужна переменная... не большая проблема, чтобы написать еще одну строку кода, а затем отключить ее, если вам нужно.
$array = array("first" => 123, "second" => 456, "last" => 789,); $keys = array_keys($array); $last = end($keys);
Хотя end() кажется самым простым, это не самый быстрый.
Более быстрая и более сильная альтернатива - array_slice()
$last_key = key(array_slice($array, -1, 1, TRUE));Забастовка редактора: эта претензия не была подтверждена, и в комментариях были упомянуты противоположные доказательства. Если в утверждениях этого плаката относительно скорости / эффективности есть какая-то доля правды, тогда необходимо провести контрольный тест.
$arr = array("key1"=>"value1","key2"=>"value2","key3"=>"value3"); list($last_key) = each(array_reverse($arr)); print $last_key; // key3
Начиная с PHP 7.3 (2018) для этого существует (наконец) функция: http://php.net/manual/en/function.array-key-last.php
$array = ["apple"=>10,"grape"=>15,"orange"=>20]; echo array_key_last ($array)
я предпочитаю
End(array_keys($myarr))
Я также хотел бы предложить альтернативное решение этой проблемы.
Предполагая, что все ваши ключи являются числовыми без каких-либо пробелов, моим предпочтительным методом является подсчет массива, а затем минус 1 из этого значения (для учета того факта, что ключи массива начинаются с 0.
$array = array(0=>"dog", 1=>"cat"); $lastKey = count($array)-1; $lastKeyValue = $array[$lastKey]; var_dump($lastKey); print_r($lastKeyValue);
Это даст вам:
Другой способ (хотя по существу эквивалентен new ArrayList(Arrays.asList(array)) решению new ArrayList(Arrays.asList(array)) :
Collections.addAll(arraylist, array);
Ассоциативный массив – незаменимый тип данных, используемый для описания совокупности уникальных ключей и ассоциативных значений, – является базовым элементом всех языков программирования, включая PHP. По существу, ассоциативные массивы играют такую важную роль в веб-программировании, что в PHP включена поддержка множества функций и свойств, способных управлять массивами данных всеми мыслимыми способами. Такая обширная поддержка может оказаться чересчур громоздкой для разработчиков, ищущих наиболее эффективные способы управления массивами в своих приложениях. В этой статье я приведу 10 подсказок, которые помогут вам резать, кромсать и шинковать ваши данные бесконечным числом способов.
1. Добавление элементов массива.
PHP – слабо типизированный язык, т. е. в нем не надо детально описывать ни массив, ни его размер. Вместо этого массив можно одновременно объявить и наполнить:
$capitals = array("Alabama" => "Montgomery", "Alaska" => "Juneau", "Arizona" => "Phoenix");
Дополнительные элементы массива могут присоединяться следующим способом:
$capitals["Arkansas"] = "Little Rock";
Если вы работаете с массивами, пронумерованными числами, и предпочли бы присоединять элементы (в начало массива) и прикреплять элементы, используя детально-названную функцию, рассмотрите array_push() и array_unshift() функции (эти функции не работают с ассоциативными массивами).
2. Удаление элементов массива
Чтобы удалить элемент из массива, воспользуйтесь unset() функцией:
Unset($capitals["California"]);
Работая с массивами, пронумерованными числами, вы получаете больше свободы в том, что касается удаления элементов массива. Т. е. вы можете воспользоваться функциями array_shitt() и array_pop() , чтобы удалить элемент с начала и с конца массива соответственно.
3. Меняем местами ключи и значения
Предположим, что вы захотели создать новый массив с именем $states , столицы штатов в котором будут индексами, а сами штаты – ассоциативными значениями. Данная задача (меняем местами ключи и значения) легко решается с помощью array_flip() функции:
$capitals = array("Alabama" => "Montgomery", "Alaska" => "Juneau", "Arizona" => "Phoenix"); $states = array_flip($capitals); // $states = array(// "Montgomery" => string "Alabama", // "Juneau" => string "Alaska", // "Phoenix" => string "Arizona" //);
4. Слияние массивов
Предположим, что предыдущий массив использовался в сочетании с основанным на web-технологиях "flash card" (flashcard - карточка с текстом и картинкой (используется при обучении иностранному языку)) сервисом и вы захотели дать возможность студентам проверить их знания не только о мировых столицах, но и столицах соединенных штатов. Можно соединить массив (со столицами штатов) с массивом (с мировыми столицами) использую array_merge() функцию:
$stateCapitals = array("Alabama" => "Montgomery", "Alaska" => "Juneau", "Arizona" => "Phoenix"); $countryCapitals = array ("Australia" => "Canberra", "Austria" => "Vienna", "Algeria" => "Algiers"); $capitals = array_merge($stateCapitals, $countryCapitals);
5. Редактирование значений массивов
Предположим, что найденные в массиве данные могут содержать ошибки связанные с употреблением заглавных букв, а вы хотите исправить эти ошибки, прежде чем вносить данные в базу данных. В этом случае можно воспользоваться array_map() функцией, чтобы применить callback-функцию к каждому элементу массива:
Function capitalize($element) { $element = strtolower($element); // Переводим все буквы в нижний регистр return ucwords($element); // Преобразуем в верхний регистр первый символ каждого слова в строке } $capitals = array("Alabama" => "montGoMEry", "Alaska" => "Juneau", "Arizona" => "phoeniX"); $capitals = array_map("capitalize", $capitals);
6. Сортируем массивы по ключам
Флэшкард приложения (flashcard - карточка с текстом и картинкой (используется при обучении иностранному языку)) прибегают к различным техникам обучения, включая сортировку карточек определенными способами, к примеру, по алфавиту. Можно сортировать ассоциативные массивы по ключам, используя ksort() функцию:
$capitals = array("Arizona" => "Phoenix", "Alaska" => "Juneau", "Alabama" => "Montgomery"); ksort($capitals);
7. Рандомизация порядка массива
Перемешать элементы в случайном порядке можно при помощи функции shuffle() :
$capitals = array("Arizona" => "Phoenix",
"Alaska" => "Juneau",
"Alabama" => "Montgomery");
shuffle($capitals);
foreach ($capitals as $k=>$v)
echo "$k: $v
";
Результат:
Обратите внимание, на выходе мы получаем не ассоциативный массив, а числовой массив .
Если вместо рандомизации массива вы хотите наугад выбрать значение, воспользуйтесь array_rand() функцией.
8. Определяем, существуют ли ключи и значения
Можно воспользоваться in_array() функцией, чтобы определить, существуют ли элементы массива:
$capitals = array("Arizona" => "Phoenix", "Alaska" => "Juneau", "Alabama" => "Montgomery"); if (in_array("Juneau", $capitals)) { echo "Exists!"; } else { echo "Does not exist!"; }
Возможность определить: существуют ли ключи массива, менее известна. Реализуется же она с помощью array_key_exists() функции:
$capitals = array("Arizona" => "Phoenix", "Alaska" => "Juneau", "Alabama" => "Montgomery"); if (array_key_exists("Alaska", $capitals)) { echo "Key exists!"; } else { echo "Key does not exist!"; }
9. Ищем массив
Возможно, вы захотите снабдить флэшкард ресурс поиском, чтобы пользователи легко могли найти штат, которой связан с определенной столицей. Это можно осуществить с помощью функции array_search() (эта функция ищет в массиве заданное значение и возвращает соответствующий ключ):
$capitals = array("Arizona" => "Phoenix", "Alaska" => "Juneau", "Alabama" => "Montgomery"); $state = array_search("Juneau", $capitals); // $state = "Alaska"
10. Стандартная PHP библиотека
Стандартная PHP библиотека (SPL) снабжает разработчиков порядочным числом структур данных, интерфейсов, исключений и других свойств, которыми раньше язык PHP похвастаться не мог. Среди этих свойств есть возможность итерации (повторения) массива с помощью объекто-оринетированного синтаксиса.
$capitals = array("Arizona" => "Phoenix",
"Alaska" => "Juneau",
"Alabama" => "Montgomery");
$arrayObject = new ArrayObject($capitals);
foreach ($arrayObject as $state => $capital)
{
printf("The capital of %s is %s
", $state, $capital);
}
// The capital of Arizona is Phoenix
// The capital of Alaska is Juneau
// The capital of Alabama is Montgomery
Это только одно из классных свойств, включенных в SPL. Для получения большей информации ознакомьтесь с PHP документацией.
Последнее обновление: 1.11.2015
Массивы предназначены для хранения наборов данных или элементов. Каждый элемент в массиве имеет свой уникальный ключ и значение. Итак, сохраним в массив список моделей телефонов:
"; ?>
Здесь создается массив $phones из четыре элементов. Каждый элемент в массиве представляет собой пару ключ - значение . Так, первый элемент $phones = "Nokia N9" имеет ключ - число 0, а значение - строку "Nokia N9". В таких массивах числовые ключи еще называются индексами.
С помощью функции count() можно узнать количество элементов в массиве. А благодаря тому, что ключи идут по порядку от 0 до 3, и зная размер массива, можно вывести элементы массивы в цикле for .
Чтобы было более понятно отношения ключей и значений элементов, выведем массив с помощью функции print_r :
Print_r($phones);
У нас получится следующий вывод:
Array ( => Nokia N9 => Samsung Galaxy ACE II => Sony Xperia Z3 => Samsung Galaxy III)
Данное создание массива будет также эквивалентно следующему:
"; ?>
Если не указывается ключ элемента, то PHP в качестве ключей использует числа. При этом нумерация ключей начинается с нуля, а каждый новый ключ увеличивается на единицу.
Зная ключ элемента в массиве, мы можем обратиться к этому элементу, получить или изменить его значение:
// получим элемент по ключу 1
$myPhone = $phones;
echo "$myPhone
";
// присвоение нового значения
$phones = "Samsung X650";
echo "$phones
";
Но в качестве ключей могут использоваться не только целые числа, но и строки:
Подобные массивы еще называют ассоциативными.
Оператор array
Выше был рассмотрен один способ создания массива. Но есть и другой, который предусматривает применение оператора array() .
Оператор array() принимает набор элементов. Здесь также явным образом не указаны ключи. Поэтому PHP автоматически нумерует элементы с нуля. Но мы также можем указать для каждого элемента ключ:
"iPhone5", "samsumg"=>"Samsung Galaxy III", "nokia" => "Nokia N9", "sony" => "Sony XPeria Z3"); echo $phones["samsumg"]; ?>
Операция => позволяет сопоставить ключ с определенным значением.
Перебор ассоциативных массивов
Выше мы посмотрели, как с помощью цикла for вывести все элементы массива, где ключи заданы последовательно числами от 0 до 3. Однако с ассоциативными массивами это не работает. И для них в PHP предназначен специальный тип цикла - foreach...as :
"iPhone5",
"samsumg"=>"Samsung Galaxy III",
"nokia" => "Nokia N9",
"sony" => "Sony XPeria Z3");
foreach($phones as $item)
echo "$item
";
?>
В цикле foreach из массива последовательно извлекаются все элементы и их значение помещается в переменную, указанную после ключевого слова as . В данном случае в переменную $item по очереди помещаются все четыре значения из массива $phones. Когда будет извлечен последний элемент из массива, цикл завершается.
Цикл foreach позволяет извлекать не только значения, но и ключи элементов:
"iPhone5",
"samsumg"=>"Samsung Galaxy III",
"nokia" => "Nokia N9",
"sony" => "Sony XPeria Z3");
foreach($phones as $key=>$value)
echo "$key => $value
";
?>
Здесь при переборе элементов цикла в переменную $key будет передаваться ключ элемента, а в переменную $value ее значение.
Альтернативу циклу foreach представляет использование функций list и each :
"iPhone5",
"samsumg"=>"Samsung Galaxy III",
"nokia" => "Nokia N9",
"sony" => "Sony XPeria Z3");
while (list($key, $value) = each($phones))
echo "$key => $value
";
?>
Цикл while будет работать, пока функция each не вернет значение false . Функция each проходит по всем элементам массива $phones и получает его в виде массива, в который входят ключ и значение элемента. Затем этот массив передается функции list и проиcходит присваивает значения массива переменным внутри скобок. Когда функция each закончит перебор элементов массива $phones, она возвратит false , и действие цикла while будет завершено.
Многомерные массивы
В предыдущих примерах рассматривались только одномерные массивы, где значения элементов представляли числа, строки. Но в PHP массивы могут также быть многомерными, то есть такими, где элемент массива сам является массивом. Например, создадим многомерный массив:
array("iPhone5", "iPhone5s", "iPhone6") , "samsumg"=>array("Samsung Galaxy III", "Samsung Galaxy ACE II"), "nokia" => array("Nokia N9", "Nokia Lumia 930"), "sony" => array("Sony XPeria Z3", "Xperia Z3 Dual", "Xperia T2 Ultra")); foreach ($phones as $brand => $items) { echo "
$brand
"; echo "- ";
foreach ($items as $key => $value)
{
echo "
- $value "; } echo "
И при выводе мы получим 4 списка:
Чтобы обратиться к элементу данного, также надо указать ключи в квадратных скобках. Например, обратимся к первому элементу в первом массиве. Так как ключ первого массива - "apple", а ключ первого элемента в первом массиве - число 0 (так как мы явным образом не указали ключи):
Echo $phones["apple"];
Подобным образом можно получить второй элемент третьего массива:
Echo $phones["nokia"];
Допустим, вложенные массивы также представляют ассоциативные массивы:
array("apple" => "iPhone5", "samsumg" => "Samsung Galaxy III", "nokia" => "Nokia N9"), "tablets" => array("lenovo" => "Lenovo IdeaTab A3500", "samsung" => "Samsung Galaxy Tab 4", "apple" => "Apple iPad Air")); foreach ($technics as $tovar => $items) { echo "
$tovar
"; echo "- ";
foreach ($items as $key => $value)
{
echo "
- $key: $value "; } echo "