Создавая некоторые функции для моего фреймворка, думаю, они вас остановят.
1. Задать значение функции в массиве, используя ссылку для навигации
- если ссылка заканчивается именем / ключом, это имя / ключ будет равно значению установки
- если ссылка заканчивается разделителем, фамилия / ключ будут массивом со значением настройки
function array_reference_set($input_arr=array(),$reference='',$delimiter='->',$set_var=''){
switch ($reference){
case (is_string($reference)):
$reference = array_reverse(explode($delimiter, $reference),true);
break;
case (!is_array($reference)):
return $input_arr;
}
$key = array_pop($reference);
if (count($reference)<1){
if($key!=''){
$input_arr[$key] = $set_var;
}elseif (!is_array($input_arr) && $key==''){
$input_arr = array($set_var);
}elseif ($key==''){
$input_arr[] = $set_var;
}
}else{
if (!is_array($input_arr)){
$input_arr = array($key=>array());
}
if (isset($input_arr[$key])){
$input_arr[$key] = $this->array_reference_set($input_arr[$key],$reference,$delimiter,$set_var);
}else{
$input_arr[$key] = $this->array_reference_set(array(),$reference,$delimiter,$set_var);
}
}
return $input_arr;
}
$arr = array_reference_set(array(),'a->b->c','->','test');
//equal
$arr = array('a'=>array('b'=>array('c'=>'test')));//or
$arr['a']['b']['c'] = 'test';
$arr = array_reference_set(array(),'a->b->c->','->','test');
//equal
$arr = array('a'=>array('b'=>array('c'=>array('test'))));//or
$arr['a']['b']['c'][] = 'test';
2. Функция устанавливает неустановленное значение из массива, используя ссылку
- если окончание ссылки является разделителем, то переменная будет сброшена с именем / ключом перед разделителем
- один момент использования этой функции: вам нужно обновить массив по возвращенному результату функции (в конце примера кода)
function array_reference_unset($input_arr=array(),$reference='',$delimiter='->'){
switch ($reference){
case (is_string($reference)):
$reference = array_reverse(explode($delimiter, $reference),true);
break;
case (!is_array($reference)):
return $input_arr;
}
$key = array_pop($reference);
if (count($reference)<1 && is_string($key)){
if ($key!=''){
unset($input_arr[$key]);
}else{
return false;
}
}else{
if (isset($input_arr[$key])){
$ret = $this->array_reference_unset($input_arr[$key],$reference,$delimiter);
if ($ret!==false){
$input_arr[$key] = $ret;
}else{
unset ($input_arr[$key]);
}
}
}
return $input_arr;
}
$arr = array('a'=>array('b'=>array('c'=>'test')));// test subject
$arr = array_reference_unset($arr,'a->b->c','->');//and
$arr = array_reference_unset($arr,'a->b->c->','->');
//equal
unset($arr['a']['b']['c']);
p.s. извините за мой чистый английский