Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


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

Упрощенная ситуация:
Предположим у меня массив
$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,290
Репутация: 1064
По умолчанию

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
Репутация: 10
По умолчанию

Спасибо.
Но, боюсь, я сильно упростил исходную ситуацию...(
Массив на самом деле не линейный и переменная $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,290
Репутация: 1064
По умолчанию

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

В принципе теперь я понимаю что попал на хардкор..
Поискал в интернете - ничего не нашел( Смотрел в сторону 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,290
Репутация: 1064
По умолчанию

Не вижу пока другого способа решить это – кроме использования 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
Репутация: 10
По умолчанию

Дело закончилось так:
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 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


16:44.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru