2012-02-05 2 views
3
$arr = array('a' => 1, 'b' => 2); 

$xxx = &$arr['a']; 

unset($xxx); 

print_r($arr); // still there :(

так снята с охраны только ломает ссылку ...Отключение ссылочные элементы массива

Вы знаете способ, чтобы сбросить элемент ссылочного массива?

Да, я знаю, что мог бы использовать unset($arr['a']) в коде выше, но это возможно только тогда, когда я точно знаю, сколько элементов имеет массив, и, к сожалению, я этого не делаю.

Этот вопрос отчасти связан с this one (это является причиной, почему это решение не работает)

+0

Невозможно снять ($ arr); ?? – Nalaka526

ответ

2

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

$arr = array('a' => 1, 'b' => 2); 
$xxx = &$arr['a']; 

$keyToUnset = null; 
foreach($arr as $key => $value) 
{ 
     if($value === $xxx) 
     { 
      $keyToUnset = $key; 
      break; 
     } 
} 
if($keyToUnset !== null) 
    unset($arr[$keyToUnset]); 
$unset($xxx); 

Ну, во всяком случае, что-то в этом роде. Однако имейте в виду, что это не очень эффективно, потому что каждый раз, когда вам нужно отменить элемент, вы должны перебирать весь массив, ища его.

Предполагая, что у вас есть контроль над использованием $ xxx, вы можете захотеть использовать его для хранения ключа в массиве вместо ссылки на элемент ключа. Таким образом, вам не нужно будет искать массив, если вы хотите удалить элемент. Но вы должны заменить все сайты, которые используют $ ххх с разыменованием массива:

$arr = array('a' => 1, 'b' => 2); 
$xxx = 'a'; 

// instead of $xxx, use: 
$arr[$xxx]; 

// to unset, simply 
unset($arr[$xxx]); 
+0

Хорошее решение, но как насчет следующего кода? $ arr = array ('a' => 1, 'b' => 2, 'c' => 1); $ xxx = & $ arr ['c']; Вот почему это не работает для меня :( –

1

Когда вы сбросить ссылку, вы просто разорвать связывание между именем переменной и переменным содержанием. Это не означает, что содержимое переменной будет уничтожено.

А относительно приведенного выше кода - я не думаю, что есть необходимость в отдельном ключевом

foreach($arr as $key => $value) 
{ 
     if($value === $xxx) 
     { 
      unset($arr[$key]); 
      break; 
     } 
} 
0

Простой ответ:

$arr = array('a' => 1, 'b' => 2); 

$xxx = 'a'; 

unset($arr[$xxx]); 

print_r($arr); // gone :) 

т.е. Вы, вероятно, действительно никогда не нужно. ссылка. Просто установите $xxx на соответствующий ключ.

Смежные вопросы