Преобразование var_dump массива обратно в переменную массива

Вы можете написать функцию таблицы PIPELINED, которая возвращает 1 столбец столбца. Каждая строка представляет собой значение из строки, разделенной запятыми. Используйте это как pop строку из списка, а put - как строку в таблице:

PIPE ROW(ltrim(rtrim(substr(l_list, 1, l_idx - 1),' '),' '));

Использование:

SELECT * FROM MyTable 
WHERE 'c2' IN TABLE(Util_Pkg.split_string(categories));

Подробнее см. Здесь : Oracle docs

42
задан Amal Murali 18 May 2014 в 08:18
поделиться

5 ответов

var_export или serialize - это то, что вы ищете. var_export отобразит синтаксис анализируемого массива PHP, а serialize отобразит нечеловеческое, но обратимое преобразование «массив в строку» ...

Edit Хорошо, для задачи:

Обычно я конвертирую вывод в сериализованную строку (а затем десериализую ее). Я не утверждаю, что это идеально, но похоже, что он работает с некоторыми довольно сложными структурами, которые я пробовал ...

function unvar_dump($str) {
    if (strpos($str, "\n") === false) {
        //Add new lines:
        $regex = array(
            '#(\\[.*?\\]=>)#',
            '#(string\\(|int\\(|float\\(|array\\(|NULL|object\\(|})#',
        );
        $str = preg_replace($regex, "\n\\1", $str);
        $str = trim($str);
    }
    $regex = array(
        '#^\\040*NULL\\040*$#m',
        '#^\\s*array\\((.*?)\\)\\s*{\\s*$#m',
        '#^\\s*string\\((.*?)\\)\\s*(.*?)$#m',
        '#^\\s*int\\((.*?)\\)\\s*$#m',
        '#^\\s*bool\\(true\\)\\s*$#m',
        '#^\\s*bool\\(false\\)\\s*$#m',
        '#^\\s*float\\((.*?)\\)\\s*$#m',
        '#^\\s*\[(\\d+)\\]\\s*=>\\s*$#m',
        '#\\s*?\\r?\\n\\s*#m',
    );
    $replace = array(
        'N',
        'a:\\1:{',
        's:\\1:\\2',
        'i:\\1',
        'b:1',
        'b:0',
        'd:\\1',
        'i:\\1',
        ';'
    );
    $serialized = preg_replace($regex, $replace, $str);
    $func = create_function(
        '$match', 
        'return "s:".strlen($match[1]).":\\"".$match[1]."\\"";'
    );
    $serialized = preg_replace_callback(
        '#\\s*\\["(.*?)"\\]\\s*=>#', 
        $func,
        $serialized
    );
    $func = create_function(
        '$match', 
        'return "O:".strlen($match[1]).":\\"".$match[1]."\\":".$match[2].":{";'
    );
    $serialized = preg_replace_callback(
        '#object\\((.*?)\\).*?\\((\\d+)\\)\\s*{\\s*;#', 
        $func, 
        $serialized
    );
    $serialized = preg_replace(
        array('#};#', '#{;#'), 
        array('}', '{'), 
        $serialized
    );

    return unserialize($serialized);
}

Я тестировал его на сложной структуре, такой как:

array(4) {
  ["foo"]=>
  string(8) "Foo"bar""
  [0]=>
  int(4)
  [5]=>
  float(43.2)
  ["af"]=>
  array(3) {
    [0]=>
    string(3) "123"
    [1]=>
    object(stdClass)#2 (2) {
      ["bar"]=>
      string(4) "bart"
      ["foo"]=>
      array(1) {
        [0]=>
        string(2) "re"
      }
    }
    [2]=>
    NULL
  }
}
64
ответ дан 26 November 2019 в 22:48
поделиться

Используйте регулярное выражение, чтобы изменить массив (.) {(. *)} На массив ($ 1) и оценить код, это не так просто, как написано, потому что вам нужно иметь дело с совпадающими скобками и т. Д., Просто подсказка о том, как найти решение;)

  • это будет полезно, если вы не можете изменить var_dump на var_export или сериализовать
1
ответ дан 26 November 2019 в 22:48
поделиться

Я думаю, вы ищете функцию сериализовать :

serialize - Создает хранимый представление значения

Это позволяет вам сохранить содержимое массива в читаемом формате, а позже вы можете прочитать массив обратно с помощью функции unserialize .

Используя эти функции, вы можете сохранять / извлекать массивы даже в текстовых / плоских файлах, а также в базе данных.

0
ответ дан 26 November 2019 в 22:48
поделиться

Если вы хотите кодировать / декодировать массив, подобный этому, вы должны либо использовать var_export () , который генерирует вывод в массиве PHP, например:

array(
  1 => 'foo',
  2 => 'bar'
)

может быть результатом этого. Однако вам придется использовать eval () , чтобы вернуть массив, и это потенциально опасный способ (тем более, что eval () действительно выполняет код PHP, поэтому простой код инъекция может помочь хакерам получить контроль над вашим PHP-скриптом).

Еще одним лучшим решением является serialize () , который создает сериализованную версию любого массива или объекта; и json_encode () , который кодирует любой массив или объект в формате JSON (который более предпочтителен для обмена данными между разными языками).

5
ответ дан 26 November 2019 в 22:48
поделиться

Хитрость заключается в том, чтобы совпадать по кускам кода и "strings", а на строках ничего не делать, кроме как делать замены:

$out = preg_replace_callback('/"[^"]*"|[^"]+/','repl',$in);

function repl($m)
{
    return $m[0][0]=='"'?
        str_replace('"',"'",$m[0])
    :
        str_replace("(,","(",
            preg_replace("/(int\((\d+)\)|\s*|(string|)\(\d+\))/","\\2",
                strtr($m[0],"{}[]","(), ")
            )
        );
}

outputs:

array('this'=>array('is'=>'the'),'challenge'=>array('for'=>array(0=>'you')))

(удаление восходящих числовых клавиш, начинающихся с 0, требует небольшого дополнительного учета, что можно сделать в функции repl.)

ps. это не решает проблему строк, содержащих ", но, поскольку кажется, что var_dump не экранирует содержимое строки, нет никакого способа решить это надежно. (вы можете сопоставить ["[^"]*"], но строка может содержать "] также)

4
ответ дан 26 November 2019 в 22:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: