Удалить элементы массива слева от заданного ключа в PHP

Четверг, Декабрь 30th, 2010 | Программирование

1 звезда2 звезд3 звезд4 звезд5 звезд (1 голосов, средний: 5.00 из 5)
Loading ... Loading ...

Недавно меня посетило желание удалить из ассоциативного массива в 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;
    }
}

Удачи ;)



Комментариев нет.

Оставить отзыв

Сначала зарегистрируйтесь.

Поиск по блогу