Php 将数组的一部分添加或修改为mysql字符串

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位),并

我目前在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位),并修改子群体中的具体数字(例如,将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?