Найти элемент по ключу без использования eval

я знаю это eval() это ужасная вещь, но я не мог придумать лучшего способа сделать это.

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

public function delete(){
$keys = func_get_args();
$str  = "";
foreach($keys as $key){
$str .= "['$key']";
}
eval("if(isset(\$_SESSION$str)){unset(\$_SESSION$str);}");
}

Чтобы использовать его, я бы позвонил так:

$obj->delete("one", "two", "three");

что будет эквивалентно этому:

if(isset($_SESSION["one"]["two"]["three"])){
unset($_SESSION["one"]["two"]["three"]);
}

Есть ли лучший способ сделать это, чем с помощью eval()?

0

Решение

Это позволит достичь того, что вы хотите:

function delete(){
$keys = func_get_args();

$ref = &$_SESSION;
for($x = 0; $x < sizeOf($keys)-1; $x++) {
$ref = &$ref[$keys[$x]];
}
unset($ref[$keys[sizeOf($keys)-1]]);
unset($ref);
}
1

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

Есть такая функция в Узо Гудис:

Arrays::removeNestedKey($_SESSION, ['one', 'two', 'three']);

Если вы не хотите включать библиотеку, вы можете взглянуть на исходный код и возьмите саму функцию:

public static function removeNestedKey(array &$array, array $keys)
{
$key = array_shift($keys);
if (count($keys) == 0) {
unset($array[$key]);
} else {
self::removeNestedKey($array[$key], $keys);
}
}
4

По вопросам рекламы [email protected]