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

时间:2016-10-10 02:46:32

标签: php mysql database string

我目前在mysql数据库中有一个列,它存储带分隔符的字符串,所以我可以将它转换为php中的数组。

示例字符串如下所示:

23,1,1|72,2,0|16,3,1|...etc.

它基本上将它划分为3个主要组|,3个较小的组,如果有更清洁的方式,请告诉我):

  1. 第一个数字是来自不同表格的文章的ID号
  2. 第二个只是用于缩进目的的数字
  3. 第三个是否可见( 0或1 )。
  4. 我将有一个管理部分,我们可以重新订购主要组(,即将第3组移至第2位)并修改子组中的特定数字(例如将72,1,0更改为72,2,0 )我不确定如何实现这一目标。

    在重新插入数据库时​​,如何在保持订单(或新订单)的同时循环执行这些修改?

    我想在我的字符串中添加另一个数字来确定每个主要群体的位置?像这样:

    1[23,1,1]2[72,2,0]3[16,3,1]
    

    但是我如何循环使用并移动东西呢?

    非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

我同意有关规范化的评论,但是如果你坚持这样做,或者坚持使用现有的模式,你就无法改变,如果可以的话,使用PHP serialize / unserialize函数,而不是字符串解析。这将至少允许您将数据检索到PHP并修改数组,然后将其保存回来。

http://php.net/manual/en/function.serialize.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>'; 
    }


    ?>