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// )