我目前在mysql数据库中有一个列,它存储带分隔符的字符串,所以我可以将它转换为php中的数组。
示例字符串如下所示:
23,1,1|72,2,0|16,3,1|...etc.
它基本上将它划分为3个主要组|
,3个较小的组,
(如果有更清洁的方式,请告诉我):
我将有一个管理部分,我们可以重新订购主要组(,即将第3组移至第2位)并修改子组中的特定数字(例如将72,1,0更改为72,2,0 )我不确定如何实现这一目标。
在重新插入数据库时,如何在保持订单(或新订单)的同时循环执行这些修改?
我想在我的字符串中添加另一个数字来确定每个主要群体的位置?像这样:
1[23,1,1]2[72,2,0]3[16,3,1]
但是我如何循环使用并移动东西呢?
非常感谢任何帮助。
答案 0 :(得分:1)
我同意有关规范化的评论,但是如果你坚持这样做,或者坚持使用现有的模式,你就无法改变,如果可以的话,使用PHP serialize / unserialize函数,而不是字符串解析。这将至少允许您将数据检索到PHP并修改数组,然后将其保存回来。
答案 1 :(得分:1)
我加入了关于用于存储数据的方法的所有评论,但仍然。
这可以帮助你前进:
/** @var string $s Assumed packet */
$s = "23,3,1|72,1,0|16,2,1"; // Indent is not ordered
/** @var array $parsed Parsed packet */
$parsed = array_map(function ($segment) {
list($artId, $indent, $visibility) = explode(',', $segment);
return [
'ArticleId' => (int)$artId,
'Indent' => (int)$indent,
'Visible' => (int)$visibility !== 0
];
}, explode('|', $s));
usort($parsed, function (array $a, array $b) {
return ($a['Indent'] < $b['Indent']) ? -1 : 1;
});
您将获得按$parsed
键排序的Indent
结构:
array(3) {
[0] => array(3) {
["ArticleId"]=> int(23)
["Indent"]=> int(1)
["Visible"]=> bool(true)
}
[1] => array(3) {
["ArticleId"]=> int(72)
["Indent"]=> int(2)
["Visible"]=> bool(false)
}
[2] => array(3) {
["ArticleId"]=> int(16)
["Indent"]=> int(3)
["Visible"]=> bool(true)
}
}
因此,您可以根据需要在解析之前/之后应用usort()
来更改Indent
。
关于存储此结构在数据库中的决定方式,您可以使用 JSON格式( json_encode()
,{{3 }})。这种“序列化”方式比提议的json_decode()
方法更快,并且比$parsed
方法更快,更可读。如果您担心冗余,可以json_encode()
数组没有数组键并在解析时添加它们或直接使用[0]
,[1]
,[2]
事先知道对应关系。
如果使用
json_*()
函数,则可以省略结构解析。它将被解码,就像你为了保存而编码一样。可以使用相同的usort()
在保存时定义订单。这可以被认为是通过减少过多的排序来改善。读数/解码将比保存更频繁地发生。
答案 2 :(得分:0)
我对你的问题很感兴趣。所以我创造了这个。它可能不喜欢你想要的。
<?php
$string = "23,1,1|72,2,0|16,3,1|";
$explode = explode("|", $string);
$a = array();
for($x = 0;$x<count($explode)-1;$x++)
{
$a[] = $explode[$x];
$b[] =explode(',',substr($explode[$x], strpos($explode[$x], ",") + 1));
}
for($y=0;$y<count($b);$y++){
echo $b[$y][0]. '=>'. $a[$y] . '<br>';
}
?>