Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.07.2012, 18:49   #1
SuperTone86
 
Регистрация: 23.07.2012
Сообщений: 7
По умолчанию Как удалить элемент массива используя ссылку

Упрощенная ситуация:
Предположим у меня массив
$a = array(1,2,3,4,5,6);
И есть ссылка на конкретный элемент, например
$b =& $a[3];

Необходимо удалить элемент использую ссылку($b) на элемент
т.е. типа unset($b), но unset() рвет связь а не удаляет элемент

Существует ли возможность в PHP?
SuperTone86 вне форума Ответить с цитированием
Старый 23.07.2012, 19:07   #2
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

PHP код:
$a = array(123456); //var_dump($a);
$b =& $a[3];
unset(
$a[array_search($b$a)]); //var_dump($a); 
Andkorol вне форума Ответить с цитированием
Старый 23.07.2012, 19:24   #3
SuperTone86
 
Регистрация: 23.07.2012
Сообщений: 7
По умолчанию

Спасибо.
Но, боюсь, я сильно упростил исходную ситуацию...(
Массив на самом деле не линейный и переменная $b может ссылаться на элемент на различной "глубине".

$a = array(1=>array(1=>array(1=>'a',2=>' b'),2=>'c'),2=>2);
print_r($a);
$b =& $a[1][1][2]; // == "b"
unset($a[array_search($b, $a)]); // в такой ситуации уже не катит
print_r($a);
SuperTone86 вне форума Ответить с цитированием
Старый 23.07.2012, 19:33   #4
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Не совсем понятна общая ситуация:
$b =& $a[1][1][2]; – это ж хардкод, я так понимаю?
Почему тогда нельзя просто прописать:
unset($a[1][1][2]);
?
По какому принципу формируется ссылка?
Andkorol вне форума Ответить с цитированием
Старый 23.07.2012, 19:50   #5
SuperTone86
 
Регистрация: 23.07.2012
Сообщений: 7
По умолчанию

В принципе теперь я понимаю что попал на хардкор..
Поискал в интернете - ничего не нашел( Смотрел в сторону array_walk_recursive(), но понял так что она(т.е с её помощью) тоже не может удалять элементы так как там тоже в обрабатывающую функцию переменные по ссылкам $key $value идут.

$input = "1>>1>>2";
$input = explode(">>", "1>>1>>2"); // притом что циферки могут быть буковками
$b= & $a; // $a это как раз тот массив
foreach( $input as $i) $b =& $b[$i];

echo $b; // == "b";
SuperTone86 вне форума Ответить с цитированием
Старый 23.07.2012, 20:52   #6
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Не вижу пока другого способа решить это – кроме использования eval:
PHP код:
$a = array(=> array(=> array(=> 'a'=> 'b'), => 'c'), => 2); 
var_dump($a); 

$input "1>>1>>2";
$input explode(">>"$input);
$b =& $a;
foreach(
$input as $k => $i){ 
    
$b =& $b[$i];
    
$input[$k] = '[' $i ']';// for eval
}
echo 
$b// == "b";

eval("unset(\$a" implode($input) . ");");
var_dump($a); 
Andkorol вне форума Ответить с цитированием
Старый 24.07.2012, 13:34   #7
SuperTone86
 
Регистрация: 23.07.2012
Сообщений: 7
По умолчанию

Дело закончилось так:
PHP код:
$a = array(=> array(=> array(=> 'a'=> 'b'), => 'c'), => 2); 
print_r($a);
$input "1>>1>>2";
$input explode(">>"$input);
$b =& $a;

$end end($input); array_pop($input);
foreach (
$input as $i$b =& $b[$i];
unset(
$b[$end]);

print_r($a);  
?> 
Спасибо.
SuperTone86 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как удалить элемент массива? БалаШагаЛ PHP 1 28.01.2012 20:46
Как удалить(добавить) элемент массива? vanek1 Помощь студентам 3 15.12.2010 22:26
удалить элемент из массива dron-k Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 17.09.2010 17:46
Как удалить\добавить элемент массива с++ Sanu0074 Помощь студентам 3 15.06.2010 11:53
Удалить элемент массива pavel42 Помощь студентам 14 21.05.2009 08:52