Удалить элементы массива слева от заданного ключа в PHP
Четверг, Декабрь 30th, 2010 | Программирование
Недавно меня посетило желание удалить из ассоциативного массива в PHP с разнородными ключами (строки, числа, …) все элементы массива, которые «находятся слева» от некоторого заданного ключа.
Объяснить что такое «находиться слева» достаточно тяжело, поэтому я лучше сразу приведу пример. В качестве исходных данных имеем вот такой массив:
$tmp = array("asdf" => 10, 23 => 1, "asd" => "asdf", 3 => false);Предположим, что стоит задача удалить все элементы массива, стоящие слева от ключа «asd», тогда в результате должны получить вот такой массив:
$tmp2 = array("asd" => "asdf", 3 => false);Если я вас заинтересовал, то милости прошу под кат…
Итак, для вырезки какой-то части массива используется функция array_slice, однако в качестве параметра она принимает порядковый номер ключа в массиве, а не сам ключ. Для наглядности приведу пример. Вот так расставляются эти порядковые номера:
$tmp = array(
/* 0 */ "asdf" => 10,
/* 1 */ 23 => 1,
/* 2 */ "asd" => "asdf",
/* 3 */ 3 => false);Получить порядковый номер ключа в массиве можно поискав его с помощью функции array_search в массиве ключей, который вернет функция array_keys, если ей передать в качестве аргумента исходный массив.
Таким образом, мы получили порядковый номер ключа в искомом массиве, теперь, логично предположить, что если передать все параметры в array_slice, то все будет в шоколаде – ан, нет господа!!
Оказывается, если из массива с разнородными ключами (строки, числа, …) вырезать кусок при помощи array_slice, то он переименует у результирующего массива ключи в 0, 1, 2, … , а ведь в большинстве случаев это недопустимо, поэтому необходимо при вызове функции array_slice через параметр strict передать true (тогда переименование ключей не произойдет!!).
А теперь приведу функцию, которая решает поставленную задачу.
/**
* Обрезает все элементы ассоциативного массива,
* находящиеся слева от заданного ключа
* @param array $arr Массив
* @param mixed $key Ключ
* @return array
*/
function trimLeftByKey($arr, $key)
{
if (($keyindex = array_search($key, array_keys($arr))) !== FALSE)
{
return array_slice($arr,
$keyindex,
count($arr) - $keyindex,
true);
}
else
{
return $arr;
}
}Удачи
Свежие записи
Наиболее интересные
- Взлом паролей пользователей ОС Windows - 61 голосов,




(4.82) - Как поставить Windows и Linux Ubuntu на нетбук - 27 голосов,




(4.96) - Чтение и запись в XML фаил (C#) - 24 голосов,




(4.75) - Решение СЛАУ. Метод Гаусса с выбором главного элемента - 19 голосов,




(4.37) - Можно ли играя в Линейку (Lineage II) заработать реальных денег? - 16 голосов,




(3.44) - Назначение клавиши Scroll Lock! А вы знаете зачем она? - 15 голосов,




(4.67) - Нахождение НОД и НОК без лишних слов - 14 голосов,




(4.21) - Раздавая файлы через торренты можно заработать?! - 13 голосов,




(3.15) - Как подключить Firebird в C# или «жарптица в решете» - 11 голосов,




(4.55) - Генерация лабиринта - 10 голосов,




(5.00)
Рубрики
- Закладки (4)
- Из жизни (34)
- Linux (6)
- Заработок (6)
- Игры (3)
- Тайм менеджмент (2)
- Программирование (52)
- Юмор (7)
Архивы
- Январь 2011 (3)
- Декабрь 2010 (2)
- Сентябрь 2010 (13)
- Август 2010 (4)
- Июль 2010 (5)
- Июнь 2010 (7)
- Апрель 2010 (6)
- Март 2010 (11)
- Февраль 2010 (24)
- Январь 2010 (12)
- Октябрь 2009 (1)
- Сентябрь 2009 (1)





