Вы можете написать функцию таблицы 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
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
}
}
Используйте регулярное выражение, чтобы изменить массив (.) {(. *)} На массив ($ 1) и оценить код, это не так просто, как написано, потому что вам нужно иметь дело с совпадающими скобками и т. Д., Просто подсказка о том, как найти решение;)
Я думаю, вы ищете функцию сериализовать
:
serialize - Создает хранимый представление значения
Это позволяет вам сохранить содержимое массива в читаемом формате, а позже вы можете прочитать массив обратно с помощью функции unserialize
.
Используя эти функции, вы можете сохранять / извлекать массивы даже в текстовых / плоских файлах, а также в базе данных.
Если вы хотите кодировать / декодировать массив, подобный этому, вы должны либо использовать var_export ()
, который генерирует вывод в массиве PHP, например:
array(
1 => 'foo',
2 => 'bar'
)
может быть результатом этого. Однако вам придется использовать eval ()
, чтобы вернуть массив, и это потенциально опасный способ (тем более, что eval ()
действительно выполняет код PHP, поэтому простой код инъекция может помочь хакерам получить контроль над вашим PHP-скриптом).
Еще одним лучшим решением является serialize ()
, который создает сериализованную версию любого массива или объекта; и json_encode ()
, который кодирует любой массив или объект в формате JSON (который более предпочтителен для обмена данными между разными языками).
Хитрость заключается в том, чтобы совпадать по кускам кода и "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 не экранирует содержимое строки, нет никакого способа решить это надежно. (вы можете сопоставить ["[^"]*"]
, но строка может содержать "]
также)