将 PostgreSQL 数组转换为 PHP 数组

新手上路,请多包涵

我在 PHP 中读取 Postgresql 数组时遇到问题。我试过 explode(),但这会破坏字符串中包含逗号的数组,以及 str_getcsv() 但它也不好,因为 PostgreSQL 不引用日文字符串。

不工作:

 explode(',', trim($pgArray['key'], '{}'));
str_getcsv( trim($pgArray['key'], '{}') );

例子:

 // print_r() on PostgreSQL returned data: Array ( [strings] => {または, "some string without a comma", "a string, with a comma"} )

// Output: Array ( [0] => または [1] => "some string without a comma" [2] => "a string [3] => with a comma" )
explode(',', trim($pgArray['strings'], '{}'));

// Output: Array ( [0] => [1] => some string without a comma [2] => a string, with a comma )
print_r(str_getcsv( trim($pgArray['strings'], '{}') ));

原文由 aardbol 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 871
2 个回答

如果你有 PostgreSQL 9.2,你可以这样做:

 SELECT array_to_json(pg_array_result) AS new_name FROM tbl1;

结果将以 JSON 格式返回数组

然后在 php 方面的问题:

 $array = json_decode($returned_field);

您也可以转换回来。这是 JSON 函数 页面

原文由 michaelbn 发布,翻译遵循 CC BY-SA 3.0 许可协议

由于这些解决方案都不适用于 多维数组,因此我在这里提供适用于 任何复杂数组的 递归解决方案:

 function pg_array_parse($s, $start = 0, &$end = null)
{
    if (empty($s) || $s[0] != '{') return null;
    $return = array();
    $string = false;
    $quote='';
    $len = strlen($s);
    $v = '';
    for ($i = $start + 1; $i < $len; $i++) {
        $ch = $s[$i];

        if (!$string && $ch == '}') {
            if ($v !== '' || !empty($return)) {
                $return[] = $v;
            }
            $end = $i;
            break;
        } elseif (!$string && $ch == '{') {
            $v = pg_array_parse($s, $i, $i);
        } elseif (!$string && $ch == ','){
            $return[] = $v;
            $v = '';
        } elseif (!$string && ($ch == '"' || $ch == "'")) {
            $string = true;
            $quote = $ch;
        } elseif ($string && $ch == $quote && $s[$i - 1] == "\\") {
            $v = substr($v, 0, -1) . $ch;
        } elseif ($string && $ch == $quote && $s[$i - 1] != "\\") {
            $string = false;
        } else {
            $v .= $ch;
        }
    }

    return $return;
}

我没有对其进行太多测试,但看起来它有效。在这里你有我的测试结果:

 var_export(pg_array_parse('{1,2,3,4,5}'));echo "\n";
/*
array (
  0 => '1',
  1 => '2',
  2 => '3',
  3 => '4',
  4 => '5',
)
*/
var_export(pg_array_parse('{{1,2},{3,4},{5}}'));echo "\n";
/*
array (
  0 =>
  array (
    0 => '1',
    1 => '2',
  ),
  1 =>
  array (
    0 => '3',
    1 => '4',
  ),
  2 =>
  array (
    0 => '5',
  ),
)
*/
var_export(pg_array_parse('{dfasdf,"qw,,e{q\"we",\'qrer\'}'));echo "\n";
/*
array (
  0 => 'dfasdf',
  1 => 'qw,,e{q"we',
  2 => 'qrer',
)
*/
var_export(pg_array_parse('{,}'));echo "\n";
/*
array (
  0 => '',
  1 => '',
)
*/
var_export(pg_array_parse('{}'));echo "\n";
/*
array (
)
*/
var_export(pg_array_parse(null));echo "\n";
// NULL
var_export(pg_array_parse(''));echo "\n";
// NULL

PS:我知道这是一篇非常古老的帖子,但我找不到任何适用于 postgresql 9.2 之前的解决方案

原文由 dmikam 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏