2016-10-10 4 views
2

В настоящее время у меня есть столбец в базе данных mysql, в котором хранится строка с разделителями, поэтому я могу преобразовать ее в массив в php.Добавить или изменить часть массива как строку mysql

Пример строка выглядит следующим образом:

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

Это существенно делит его на 3 основные группы с | и 3 поменьше с , (если есть уборщик способ, дайте мне знать):

  1. первый номер идентификационный номер для статьи из другой таблицы
  2. 2 просто номер для отступы целей
  3. 3rd для видимых или нет (0 или 1).

у меня будет раздел администратора, где мы будем иметь возможность изменить порядок основные группы (т.е. перемещение группы 3 в положение 2) и изменить отдельные номера из подгрупп (например, изменения 72,1,0 до 72,2,0) Я не знаю, как это сделать.

Как выполнить следующие изменения при сохранении заказа (или новом заказе) при повторной установке в базу данных?

Я думал о добавлении другого номера в свою строку, которая определяла бы положение каждой основной группы? Что-то вроде этого:

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

Но как мне пройти через это и перемещать вещи вокруг?

Любая помощь будет принята с благодарностью.

+5

Нормализация google db, это плохой способ хранения данных – nogad

+2

Конечно, есть более чистый способ. Поскольку вы используете базу данных, а не текстовый файл для хранения ваших данных, вы должны использовать механизмы, предлагаемые базой данных. Таким образом, вместо этой домашней «базы данных в ячейке» вы должны сделать еще одну ** таблицу **, а затем использовать ** JOIN ** для извлечения данных. И, пожалуйста, имейте в виду, что другого пути нет. Чем раньше вы поймете, тем больше времени и усилий вы сэкономите. –

+0

Хотелось бы, чтобы я мог использовать другие таблицы с присоединением вместо этого, но то, что я создаю, не будет работать таким образом, к сожалению. Я создаю «руководство пользователя» с несколькими версиями (текущие версии). Одна таблица будет для всего содержимого всех версий, в другой таблице будут перечислены все версии с одним из столбцов, как показано выше. Он расскажет, какой контент и в каком порядке отображать его для каждой версии. – KeepCool

ответ

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>'; 
    } 


    ?> 
+0

Спасибо. Это действительно работает, но как изменить порядок основных групп этой строки массива. Итак, переместите 16,3,1 в положение «2», например: 23,1,1 | 16,3,1 | 72,2,0? – KeepCool

1

Я согласен с комментариями по поводу нормализации, но если вы настаиваете на том, чтобы делать это таким образом или застряли в существующей схеме, которую вы не можете изменить, используйте функции сериализации/unserialize PHP, если можете, а не синтаксический анализ строк. Это, по крайней мере, позволит вам извлечь данные в PHP и изменить массив, а затем сохранить его обратно.

http://php.net/manual/en/function.serialize.php

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) 
    } 
} 

Таким образом, вы можете изменить Indent как вы хотите просто применяя usort() до/после разбора.

Что касается хранения этой структуры в базе данных так, как вы решили, вы можете использовать формат JSON (json_encode(), json_decode()). Такой способ «сериализации» быстрее, чем предлагаемый метод serialize() и способ более быстрый, чем $parsed подход + читаемость. Если вы беспокоитесь об избыточности, вы можете получить массив без ключей массива и добавить их при разборе или напрямую использовать [0], [1], [2] зная корреспонденцию заранее.

Если вы используете функции json_*(), вы можете пропустить структуру синтаксического анализа. он будет декодирован так же, как вы его закодировали для сохранения. Заказ можно определить при сохранении с использованием того же usort(). Это можно рассматривать как улучшение путем сокращения чрезмерных сортов bec. чтение/декодирование будет происходить чаще, чем сохранение.

Смежные вопросы