Convert PostgreSQL array to PHP array Convert PostgreSQL array to PHP array postgresql postgresql

Convert PostgreSQL array to PHP array


If you have PostgreSQL 9.2 you can do something like this:

SELECT array_to_json(pg_array_result) AS new_name FROM tbl1;

The result will return the array as JSON

Then on the php side issue:

$array = json_decode($returned_field);

You can also convert back. Here are the JSON functions page


As neither of these solutions work with multidimentional arrays, so I offer here my recursive solution that works with arrays of any complexity:

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;}

I haven't tested it too much, but looks like it works.Here you have my tests with results:

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";// NULLvar_export(pg_array_parse(''));echo "\n";// NULL

P.S.: I know this is a very old post, but I couldn't find any solution for postgresql pre 9.2


Reliable function to parse PostgreSQL (one-dimensional) array literal into PHP array, using regular expressions:

function pg_array_parse($literal){    if ($literal == '') return;    preg_match_all('/(?<=^\{|,)(([^,"{]*)|\s*"((?:[^"\\\\]|\\\\(?:.|[0-9]+|x[0-9a-f]+))*)"\s*)(,|(?<!^\{)(?=\}$))/i', $literal, $matches, PREG_SET_ORDER);    $values = [];    foreach ($matches as $match) {        $values[] = $match[3] != '' ? stripcslashes($match[3]) : (strtolower($match[2]) == 'null' ? null : $match[2]);    }    return $values;}print_r(pg_array_parse('{blah,blah blah,123,,"blah \\"\\\\ ,{\100\x40\t\daő\ő",NULL}'));// Array// (//     [0] => blah//     [1] => blah blah//     [2] => 123//     [3] =>//     [4] => blah "\ ,{@@ daőő//     [5] =>// )var_dump(pg_array_parse('{,}'));// array(2) {//   [0] =>//   string(0) ""//   [1] =>//   string(0) ""// }print_r(pg_array_parse('{}'));var_dump(pg_array_parse(null));var_dump(pg_array_parse(''));// Array// (// )// NULL// NULLprint_r(pg_array_parse('{または, "some string without a comma", "a string, with a comma"}'));// Array// (//     [0] => または//     [1] => some string without a comma//     [2] => a string, with a comma// )