[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Удаление элемента многомерного массива
Гость_Stas86
Пишу тут небольшой вспомогательный класс для работы с сессиями. И столкнулся с интересной задачкой. Задача такая - хочу написать метод класса remove, который принимал бы строку вида site.user.name и удалял бы элемент сессии $_SESSION['site']['user']['name'].

Естественно, длина строки может быть разная. Хоть 10-я глубина, хоть 20-я. Главное, чтобы удалялся только конечный элемент массива. Маялся-маялся, но так ничего придумать и не смог. Хотя задача на первый взгляд кажется очень простой.



Спустя 18 минут, 49 секунд (20.02.2011 - 22:14) MNO121280 написал(а):
Есть для этого специальная функция: array_pop.

Примерно так:


$new_array = array_pop($old_array);

Спустя 15 минут, 35 секунд (20.02.2011 - 22:29) Guest написал(а):
Цитата
Есть для этого специальная функция:  array_pop.

Примерно так:


$new_array = array_pop($old_array);


Цитата
mixed array_pop ( array &array )


array_pop() извлекает и возвращает последнее значение параметра array, уменьшая размер array на один элемент. Если array пуст (или не является массивом), будет возвращён NULL.


Ну и как это может помочь в нашем случае? Я так понимаю, что она извлекает последний элемент массива, более ничего делать не умеет. Так искомый элемент не обязательно будет последним.

С помощью жестких ссылок пытался решить. Но к стыду своему не знаю как потом по ссылке получить сам элемент. Другими словами, если $a = &b['one']['two']['three'], то как потом по $a получить элемент массива $b? Операция разыменования в php-то вообще есть? :)

Спустя 28 минут, 15 секунд (20.02.2011 - 22:57) T1grOK написал(а):
Ну на счет 10-20 глубины вложения вы погарячились, если мне не изменяет память то в php можно создать только 6-ти мерные массивы.

class a{
public function deset($params){
$keys = explode(".", $params);
$keys_str = '';
foreach($keys as $value){
$keys_str .= '['.$value.']';
}

eval('unset($_SESSION'.$keys_str.');');

}
}

$a = new a();
$a->deset(0);

И где мое спасибо?!)):

Спустя 52 минуты, 22 секунды (20.02.2011 - 23:50) Stas86 написал(а):
eval

Чудо-функция! Спасибо :) Не знал про нее. Как впрочем, и про ограничение на глубину массива :) Кстати, по иронии судьбы сделал так:


function remove($name)
{
$params = explode('.',$name);
switch(count($params))
{
case 1:
unset($_SESSION[$params[0]]);
break;
case 2:
unset($_SESSION[$params[0]][$params[1]]);
break;
case 3:
unset($_SESSION[$params[0]][$params[1]][$params[2]]);
break;
case 4:
unset($_SESSION[$params[0]][$params[1]][$params[2]][$params[3]]);
break;
case 5:
unset($_SESSION[$params[0]][$params[1]][$params[2]][$params[3]][$params[4]]);
break;
case 6:
unset($_SESSION[$params[0]][$params[1]][$params[2]][$params[3]][$params[4]][$params[5]]);
break;
default:
return false;
}
}
))) Ровно на 6-ю вложенность. Но ваш метод безусловно изящнее, скопирую его себе.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.