Отключить определенную переменную в многомерном массиве

Я не могу понять, как это сделать вообще. Моя первая попытка была связана с использованием ссылок и вызовом unset для ссылки, которая просто отменяет связь. Я попробовал рекурсию, но не смог заставить ее работать, затем я безуспешно пытался использовать array_walk и array_filter. Вот простой пример, который демонстрирует, что я пытаюсь сделать.

<?
class Sample {
//Please note this can have a completely variable amount of vars/dimensions
$data = array("system" => array("value1","value2"), "session" => array("value1"));

public function erase($value){
//Here I am suppose to somehow delete that exists in $this->data
}
public function display(){
print_r($this->data);
}
}$Sample = new Sample();
$Sample->erase(array("system","value1"));
//I am extremely flexible on the format of the erase parameter ($value)
$Sample->display();

should output with the variable unset($this->data["system"]["value1"]) :

array("system" => array("value2"), "session" => array("value1")

Ohgodwhy помог, создав eval.in с немного измененным примером

Спасибо за помощь

1

Решение

Я сделал эту функцию и работаю довольно хорошо.

function erase(array &$arr, array $children)
{
$ref = &$arr;
foreach ($children as $child)
if (is_array($ref) && array_key_exists($child, $ref)) {
$toUnset = &$ref;
$ref = &$ref[$child];
} else
throw new Exception('Path does\'nt exist');
unset($toUnset[end($children)]);
}

Пример 1:

Вот пример того, как вы бы сбросить $arr['session']['session3']['nestedSession2']

$arr = [
"system" => [
"system1" => "value1",
"system2" => "value2"],
"session" => [
"session1" => "value3",
"session2" => "value4",
"session3" => [
"nestedSession1" => "value5",
"nestedSession2" => "value6",
],
],
];

print_r($arr);
erase($arr, array('session', 'session3', 'nestedSession2'));
print_r($arr);

Пример 2:

Он может даже сбросить целый вложенный массив, вот как вы это сделаете (обработка ошибок):

print_r($arr);
try {
erase($arr, array('session', 'session3'));
}  catch (Exception $e) {
echo 'Caught exception: ',  $e->getMessage(), "\n";
}
print_r($arr);

Пример 3:

Также работает с неассоциативным массивом:

$arr = array('fruit1', 'fruit2', 'fruit3');
print_r($arr);
try {
erase($arr, array(0));
}  catch (Exception $e) {
echo 'Caught exception: ',  $e->getMessage(), "\n";
}
print_r($arr);

Пример 4:

В случае ошибки:

$arr = array('fruit1', 'fruit2', 'fruit3');
print_r($arr);
try {
erase($arr, array('pathThatDoesNotExit'));
}  catch (Exception $e) {
// do what you got to do here in case of error (if the path you gave doesn't exist)!
echo 'Caught exception: ',  $e->getMessage(), "\n";
}
print_r($arr);
1

Другие решения

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

if(false !== $key = array_search($value[1], $this->data[$value[0]])):
unset($this->data[$value[0]][$key]);
endif;

Вот твой eval.in пример

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector