php - 将 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[] 时,数据库要求它用大括号括起来场地。
解决方案
所以,这里的主要问题是 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);
推荐阅读
- algorithm - 如何证明T(n)=T(n-1)+log n =Θ(nlog n)的复杂度
- javascript - 映射函数不将数据返回到渲染
- regex - 拆分字符串并在数组中获取分隔符
- facebook - Ios - Facebook 登录 - 应用程序连接中的 Facebook 浏览器无法正常工作
- r - Rmd to PDF 编译错误:Package geometry \paperwidth (0.0pt) too short
- mysql - 使用 MS Access 加快将数据从 Oracle 11 移动到 MySQL
- python-2.7 - python pygogo抛出错误,没有名为builtins的模块
- r - R中的嵌套函数和内存使用
- node.js - npm 5.8.0:错误!使用 ng new 时
- javascript - 如何使用 Powershell 迭代 csv 文件