Форум сетевых администраторов
Показаны 2 сообщений на этой странице

Форум сетевых администраторов (http://netadmin.ws/forum/index.php)
- PHP (http://netadmin.ws/forum/forumdisplay.php?forumid=6)
-- Функция удаления елемента из массива (http://netadmin.ws/forum/showthread.php?threadid=11269)


Помещено polo 07-12-2005 в 15:44:

Функция удаления елемента из массива

Требуется функция (алгоритм) которая бы удаляла элемент из глобального массива. Проблема заключается в том что не удается удалить елемент из многоуровнего массива. Допустим имеем:


PHP:


$array 
= array();
// заполняем массив
for ($i = 0; $i < 5; $i++)
{
    for(
$j = 1; $j < 5; $j++)
    {
        
$arry[$i][$j] = $i . '+' . $j;
        
$array = $arry;
    }
}

/* допутим теперь нужно удалить элемент [2][3] 
   аналогично unset($GLOBALS['array']['2']['3'])
   я подумал передавать функции имя переменной
   как певый аргумент и массив дерева ключей как
   второй арнумент, но вот не получается у меня
   удалить элемент из данного массива
*/

// вызов функции
unset_array_element('array', array(2, 3));

function 
unset_array_element($varname, $keys)
{
    
$work_array = &$GLOBALS[$varname];
    if (!
is_array($keys)
    {
        unset(
$work_array[$keys]); // нет проблем
    
}
    else 
// вот тут трабла
    
{
        
// в этом и заключается поставленная задача
    
}
}

__________________
Всегда есть решение.


Помещено polo 07-12-2005 в 22:14:

При помощи RaZEr нашли два решения поставленной задачи:

первая заключается в использовании eval, что не так изящно но работает на ура.

PHP:


eval("unset(\$GLOBALS['$varname']['" . implode("']['", $keys) . "']);");


И вторая заключается в создании вспомогающей функии которая рекурсивно проходится по массиву переданному по ссылке.

PHP:

function unset_ex(&$arr, $path)
{
    
$key = array_shift($path);

    if (!empty(
$path))
    {
        
unset_ex($arr[$key], $path);
    }
    else
    {
        unset(
$arr[$key]);
    }
}
// и вышеуказанная функция
unset_array_element('array', array(2, 3)); 

function 
unset_array_element($varname, $keys) 
{ 
    
$work_array = &$GLOBALS[$varname]; 
    if (!
is_array($keys) 
    { 
        unset(
$work_array[$keys]); // нет проблем 
    
} 
    else 
// вызов рекурсии 
    
{ 
        
// eval("unset(\$GLOBALS['$varname']['" . implode("']['", $keys) . "']);");
        // или
        
unset_ex($GLOBALS[$varname], $keys);
    } 
}

__________________
Всегда есть решение.


Формат времени GMT. Текущее время 23:44.
Показаны 2 сообщений на этой странице

Powered by: vBulletin Version 2.2.4
Copyright © Jelsoft Enterprises Limited 2000, 2001.