Если вы интерпретируете строку hstore, которая поступает (напрямую или нет) из пользовательского ввода, решение Петра потенциально опасно (так как все пользовательские данные исчезают).Я не могу придумать способ злоупотребить им, но все же я бы предпочел не вычислять неизвестную строку.
Использование:
hstore (, false) преобразует входные данные в действительный строковый литерал hStore и возвращает его:
hstore(array('k1' => 'v1', 'k2' => 'v2')) => "k1"=>"v1","k2"=>"v2"
hstore () преобразует входные данные в действительный hStore, заключенный в одинарные кавычки, за которым следует: hstore
hstore(array('k1' => 'v1', 'k2' => 'v2')) => '"k1"=>"v1","k2"=>"v2"'::hstore
hstore () преобразует из строки hstore (как это происходит из запроса) в массив
hstore('"k1"=>"v1","k2"=>"v2"') => array('k1' => 'v1', 'k2' => 'v2')
Он обрабатывает значения NULL (в обе стороны) и правильно экранирует / удаляет ключи и значения.
<?php
/**
* mixed hstore(mixed $input[, bool $prepared = false])
* Convert from hstore string to array, or from array/object to hstore.
* Inner arrays/objects are serialized but deserialization is up to you; you
* are expected to keep track of which fields you sent as non-scalars.
*
* @param mixed $input A string (from hstore) or an array/object
* @param type $prepared Array or object to convert to hstore string
* @return mixed Depends on the input
*/
function hStore($input, $prepared=true)
{
if (is_string($input))
{
if ($input === 'NULL')
{
$output = NULL;
}
else
{
$re = '_("|^)(.*?[^\\\\"])"=>"(.*?[^\\\\"])("|$)_s';
preg_match_all($re, $input, $pairs);
$mid = $pairs ? array_combine($pairs[2], $pairs[3]) : array();
foreach ($mid as $k => $v)
{
$output[trim($k, '"')] = stripslashes($v);
}
}
}
elseif (is_null($input))
{
$output = $prepared ? 'NULL::hstore' : 'NULL';
}
elseif (!is_scalar($input))
{
foreach ((array)$input as $k => $v)
{
!is_scalar($v) && ($v = serialize($v));
$entries[] = '"' . addslashes($k) . '"=>' .
'"' . addslashes($v) . '"';
}
$mid = empty($entries) ? '' : join(', ', $entries);
$output = $prepared ? "'{$mid}'::hstore" : $mid;
}
return $output;
}
?>
Этот вопрос действительно является дубликатом Конвертировать postgresql hstore в массив php .
Я просто публикую здесь свой ответ на этот пост.