не установлен внутри Eval не работает - PullRequest
0 голосов
/ 05 февраля 2012

Я пытаюсь удалить элемент из массива на основе строки;

  public function delete($path){   

    // a key path given
    if(strpos($path, '.') !== false){

      $parts = explode('.', $path);
      $first_key = array_shift($parts);

      $data = $this->get($path);

      // first key doesn't exist
      if($data === false)
        return false;

      $parts = implode('"]["', $parts);
      if(eval('if(isset($data["'.$parts.'"])){ unset($data["'.$parts.'"]); return true; } return false;'))
        return $this->set($first_key, $data);

    }

    // a single key given
    if(isset($this->data[$path]){
      unset($this->data[$path]);
      return true;
    }

    return false;  
  }

И это работает только для отдельных ключей.Очевидно, eval по какой-то причине не изменяет $data.

delete('test') работает, но delete('test.child') не ...

Ответы [ 2 ]

1 голос
/ 22 декабря 2015
function unset_multiple($arr = [], $keys = [], $limitKeys = 30){
    if($keys && count($keys) <= $limitKeys && is_array($arr) && count($arr) > 0){
        foreach($keys as $key){
      $keys[$key] = null;
        }
        return array_diff_key($arr, $keys);
    } else{
    throw new Exception("Input array is invalid format or number of keys to remove too large");
    }
}

Пример называется:

$arr = array("name" => "Vuong", "age" => 20, "address" => "Saigon");
$res = unset_multiple($arr, ["name", "age"]);
//Result: ["address" => "Saigon"]

Убедитесь, что параметр $keys имеет все доступные ключи в параметре $arr (только двумерные массивы).Необходимо помнить, что эта функция помогает быстро удалить несколько элементов массива, а не возвращает абсолютно точные результаты для всех случаев.

1 голос
/ 05 февраля 2012

Я не понимаю, зачем вам здесь eval (). См. Следующее для замены вашей конструкции eval ():

<?php

function removeFromArray(&$array, $path)
{
    if (!is_array($path)) {
        $path = explode('.', trim($path, '.'));
    }

    $current = &$array;

    while ($path) {
        $key = array_shift($path);

        // isset() would fail on `$array[$key] === null`
        if (!array_key_exists($key, $current)) {
            // abort if the array element does not exist
            return false;
        }

        if (!$path) {
            // reached the last element
            unset($current[$key]);
            return true;
        }

        if (!is_array($current[$key])) {
            // can't go deeper, so abort
            return false;
        }

        // continue with next deeper element
        $current = &$current[$key];
    }

    return false;
}

$data = array(
    'a' => 1,
    'b' => array(
        'c' => 2,
        'd' => 3,
        'e' => array(
            'f' => 4,
        ),
    ),
);

var_dump(
    removeFromArray($data, 'b.e.f'),
    $data,
    removeFromArray($data, 'b.c'),
    $data
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...