将 PHP 数组转换为 PostgreSQL 数组并返回

Converting PHP array to PostgreSQL array and back

我有一个页面,我正在创建一个 PHP 数组,其中包含 select 框中的项目,我使用 json_encode 将数组转换为可以插入的字符串到字段类型为 TEXT[] 的 PostgreSQL 数据库中。但是,当我取回字符串并对其调用 json_decode 时,我得到一个空字符串。

function encode_array($libraries)
{
    $encoded = json_encode($libraries);
    // Replace the square brackets with curly braces for PostgreSQL TEXT[] field formatting.
    $encoded = str_replace('[', '{', $encoded);
    $encoded = str_replace(']', '}', $encoded);
    return $encoded;
}

function decode_array($libraries)
{
    $decodedStr = str_replace('{', '[', $libraries);
    $decodedStr = str_replace('}', ']', $decodedStr);
    $decoded = json_decode($decodedStr);
    return $decoded;
}

所以基本上,我从一个 PHP 数组开始,然后将它插入到数据库中。所以假设我有一个看起来像这样的数组:

$libraries = array('LIBRARY_01', 'LIBRARY_02', 'LIBRARY_03');

我应该得到一个类似于以下内容的数据库条目:

'{LIBRARY_01, LIBRARY_02, LIBRARY_03}'

然后一旦解码,我应该再次得到一个具有与以前相同值的 PHP 数组。

插入/编码似乎有效,因为我可以在数据库中看到数组,我假设如果编码字符串格式错误它会抱怨。

有谁知道我哪里出错了?作为参考,我使用的是 PostgreSQL 9.3 和 PHP 5.6(如果重要的话)。

编辑: 以防混淆,该数组只是一个简单的字符串数组,这些字符串中没有任何特殊符号,只有字母数字字符。我将方括号全部替换为大括号的原因是因为 json_encode 输出的 JSON 字符串将被方括号包围,但数据库要求它被大括号包围我将它传递到 TEXT[] 字段中。

所以,这里的主要问题是 json 格式使用键值对,推断的索引似乎不起作用。其次,将 json_decoded([string], TRUE) 与 TRUE 标志一起使用,为您提供关联数组,而不是对象。

尝试 运行 所有这些,看看你有什么:

<?php 

//$libraries = array('0'=>'LIBRARY_01', '1'=>'LIBRARY_02', '2'=>'LIBRARY_03');    //this will not work

$libraries = array('one'=>'LIBRARY_01', 'two'=>'LIBRARY_02', 'three'=>'LIBRARY_03');
var_dump($libraries);
echo '<br>';
$encoded = json_encode($libraries);
echo $encoded;
echo '<br>';
$encoded = str_replace('[', '{', $encoded);
$encoded = str_replace(']', '}', $encoded);
echo 'String: '.$encoded;

echo '<br>';
echo '<br>';

$stdObj = json_decode($encoded);
echo 'var_dump: ';
var_dump($stdObj);
echo '<br>';
echo 'json_encode: '.json_encode($stdObj);
echo '<br>';
foreach($stdObj as $element){
    echo $element;
    echo '<br>';
}
echo '<br>';

$array = json_decode($encoded, TRUE);
echo 'var_dump associative: ';
var_dump($array);
echo '<br>';
echo 'array[one]: '.$array[one];
echo '<br>';

echo '<br>';
echo '<br>';

echo 'json_encode: '.json_encode($array);
echo '<br>';

?>

但是,如果您只是使用 json_encode() 将一维数组转换为逗号分隔值的简单字符串列表,那么您可能会使用这种快速而肮脏的方法:

$libraries = array('LIBRARY_01', 'LIBRARY_02', 'LIBRARY_03');
$encoded = json_encode($libraries);
$encoded = str_replace('[', '{', $encoded);
$encoded = str_replace(']', '}', $encoded);

//in and out of database

$decodedStr = str_replace('{"', '', $encoded);
$decodedStr = str_replace('"}', '', $decodedStr);

$delimiter = '","';
$libraries = explode($delimiter, $decodedStr);
var_dump($libraries);

要点是,json_decode() 不是 json_encode() 的精确镜像反转。

使用 implode() 和 explode() 是更适合您情况的选择:

$libraries = array('LIBRARY_01', 'LIBRARY_02', 'LIBRARY_03');
$commaSeparatedString = implode(',', $libraries);
$string = '{'.$commaSeparatedString.'}';

//in and out of database with a comma-separated list in curly brackets

$stringFromDatabase = str_replace('{"', '', $stringFromDatabase);
$stringFromDatabase = str_replace('"}', '', $stringFromDatabase);
$array = explode(',', $stringFromDatabase);