Php 将数组的一部分添加或修改为mysql字符串
我目前在mysql数据库中有一个列,它存储一个带分隔符的字符串,这样我就可以在php中将其转换为数组 示例字符串如下所示:Php 将数组的一部分添加或修改为mysql字符串,php,mysql,database,string,Php,Mysql,Database,String,我目前在mysql数据库中有一个列,它存储一个带分隔符的字符串,这样我就可以在php中将其转换为数组 示例字符串如下所示: 23,1,1|72,2,0|16,3,1|...etc. 1[23,1,1]2[72,2,0]3[16,3,1] 它基本上将其分为三大类,分别是|,和,(如果有更干净的方法,请告诉我): 第一个数字是来自不同表的物品的ID号 2只是一个用于缩进的数字 第三个表示是否可见(0或1) 我将有一个管理部门,在那里我们将能够对主要群体进行重新排序(即,将第3组移动到第2位),并
23,1,1|72,2,0|16,3,1|...etc.
1[23,1,1]2[72,2,0]3[16,3,1]
它基本上将其分为三大类,分别是|,和,
(如果有更干净的方法,请告诉我):
第一个数字是来自不同表的物品的ID号
2只是一个用于缩进的数字
第三个表示是否可见(0或1)
我将有一个管理部门,在那里我们将能够对主要群体进行重新排序(即,将第3组移动到第2位),并修改子群体中的具体数字(例如,将72,1,0更改为72,2,0)。我不确定如何才能做到这一点
重新插入数据库时,如何在保持订单(或新订单)的同时循环这些修改
我想在字符串中再加一个数字,以确定每个主要群体的位置?大概是这样的:
23,1,1|72,2,0|16,3,1|...etc.
1[23,1,1]2[72,2,0]3[16,3,1]
但我如何循环并移动这些东西呢
任何帮助都将不胜感激。我同意关于规范化的评论,但是如果您坚持这样做,或者坚持使用无法更改的现有模式,请尽可能使用PHP序列化/取消序列化函数,而不是字符串解析。这至少允许您将数据检索到PHP中,修改数组,然后将其保存回去
我对你的问题很感兴趣。所以我创造了这个。它可能不喜欢你想要的
<?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>';
}
?>
我加入了所有关于存储数据方法的评论,但无论如何
这有助于您向前迈进:
/**@var string$s假定数据包*/
$s=“23,3,1 | 72,1,0 | 16,2,1”//未订购缩进
/**@var array$已解析数据包*/
$parsed=数组映射(函数($segment){
列表($artId、$indent、$visibility)=分解(“,”,$segment);
返回[
“ArticleId”=>(int)$artId,
“缩进”=>(int)$Indent,
“可见”=>(int)$visibility!==0
];
},爆炸(“|”,$s));
usort($parsed,函数(数组$a,数组$b){
回报($a['Indent']<$b['Indent'])?-1:1;
});
您将获得以下按缩进键排序的$parsed
结构:
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)
}
}
因此,您可以在解析前/解析后根据需要更改Indent
关于以您决定的方式在数据库中存储此结构,您可以使用JSON格式(,)。这种“序列化”方法比建议的方法快,比$parsed
方法+可读性更强。如果您担心冗余,您可以在解析时添加不带数组键的json_encode()
数组,或者直接使用[0]
,[1]
,[2]
预先知道对应关系
如果使用json_*()
函数,可以省略结构解析。它将被正确解码,就像您为保存而对其进行编码一样。可以使用相同的usort()
在保存时定义顺序。这可以被认为是通过减少过多的排序而得到的改进。读取/解码的频率将高于保存
google db标准化,这是一种不好的数据存储方式当然还有一种更干净的方式。当您使用数据库而不是文本文件来存储数据时,您应该使用数据库提供的机制。因此,您应该将其设置为另一个表,然后使用JOIN检索数据,而不是自制的“单元中的数据库”。请记住,没有别的办法了。你越早意识到这一点,你就会节省更多的时间和精力。我希望我可以使用其他表来代替join,但不幸的是,我正在构建的表不会以这种方式工作。我正在构建一个包含多个版本(持续版本)的“用户手册”。一个表将列出所有版本的所有内容,另一个表将列出所有版本,其中一列如我上面所示。它会告诉你每个版本的内容和显示顺序。谢谢。这确实有效,但如何重新排列该数组字符串的主要组。所以移动16,3,1到位置“2”,例如:23,1,1 | 16,3,1 | 72,2,0?