我有一个字符串,看起来像这样:
orders = "{1:2, 3:4, 23:45, 12:56}"
这些订单对联的长度可能不同
冒号左侧的第一个数字是ID,第二个数字是数量,即12:56=ID:12数量:56。
它是这种字符串格式,所以我可以很容易地将它作为一个大块存储在数据库中。
我想得到格式为:的字符串
Array (
ID => Quantity,
ID => Quantity
)
喜欢;
Array (
1 => 2,
3 => 4
)
到目前为止,我已经删除了所有带有声明的括号:
$string = substr(orders, 1, (strlen($intel['order']) - 2));
然后我使用了以下语句:
$chunks = explode(",", $string);
给我:Array (
[0] => 1:2
[1] => 3:4
)
有没有一种更简单的方法来格式化这个数组?我的第二个停靠港是使用另一个$chunks2 = explode(":", $chunks);
但是我很难将索引设置为ID号。。
谢谢大家。
->最后,我将使用for循环来运行多个UPDATE SQL语句,将项目的"库存"更改为("库存"-"数量")WHERE id=this id。
$orders = "{1:2, 3:4, 23:45, 12:56}";
//Clean up
$orders = substr(trim($orders),1,-1);
//Separate
$orders=explode(',',$orders);
$final=array();
//Loop
foreach ($orders as $order) {
//Explode
$order=explode(':',trim($order));
//Sanitize
if (sizeof($order)!=2) die("Bad data: Error 1");
if (!is_numeric($order[0])) die("Bad data: Error 2: '".$order[0]."'");
else $order[0]+=0;
if (!is_numeric($order[1])) die("Bad data: Error 3: '".$order[1]."'");
else $order[1]+=0;
//Tabulate
if (!isset($final[$order[0]])) $final[$order[0]]=$order[1];
else $final[$order[0]]+=$order[1];
}
print_r($final);
实际上,您可能应该考虑将这些内容与相关的ID和数量存储在单独的行中,但如果必须像这样一次性存储,我会使用JSON/serialize()或其他易于使用的东西。然而,这应该有效:
preg_match_all('/('d+):('d+)/', $orders, $matches);
$result = array_combine($matches[1], $matches[2]);
内置序列化/非序列化函数
如果你对字符串的格式不太严格,我建议你看看"serialize"answers"unserialize"函数。
serialize($array)将数组转换为字符串,如下所示:
a:size:{键定义;值定义;(每个元素重复)}
因此,
Array(1=>2,3=>4)将变为"a:2{i:1;i:2;i:3;i:4}"[其中i表示整数,a表示数组]
unserialize($string)将把字符串转换回数组。