Я не могу понять, как это сделать вообще. Моя первая попытка была связана с использованием ссылок и вызовом 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 с немного измененным примером
Спасибо за помощь
Я сделал эту функцию и работаю довольно хорошо.
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);
Если вы всегда будете передавать имя ключа массива, который содержит значение, а затем значение, мы можем использовать array_search выполнить это.
if(false !== $key = array_search($value[1], $this->data[$value[0]])):
unset($this->data[$value[0]][$key]);
endif;
Вот твой eval.in пример