将 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);
我有一个页面,我正在创建一个 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);