首页 > 解决方案 > 将 PHP 数组转换为 PostgreSQL 数组并返回

问题描述

我有一个页面,我在其中创建了一个 PHP 数组,其中包含一个选择框中的项目,我使用 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[] 时,数据库要求它用大括号括起来场地。

标签: phpdatabasepostgresqlpostgresql-9.3

解决方案


所以,这里的主要问题是 json 格式使用键值对,并且推断的索引似乎不起作用。其次,使用带有 TRUE 标志的 json_decoded([string], 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);

推荐阅读