Мне нужно упорядочить по строке, но считается, что строка между двумя "/" или между двумя "-", как это сделать - PullRequest
0 голосов
/ 08 июня 2018

Текущие данные в таблице как показано ниже

XBX/124/18
XX/10/18
XMX/12/18
XX/8/18
XX/123/18
XXX/88/18
XX/68/18
XX/145/18
YYY/5/18

данные, которые мне нужны, должны быть в этом формате

XBX/5/18
XX/8/18
XMX/10/18
XX/12/18
XX/68/18
XXX/88/18
XX/123/18
XX/124/18
YYY/145/18

Как я могу это сделать ??

Ответы [ 4 ]

0 голосов
/ 08 июня 2018

Просто получите данные из таблицы в виде массива и выполните следующие шаги, чтобы упорядочить их с помощью PHP.

<?php
    $arr = ['XBX/124/18', 'XX/10/18', 'XMX/12/18', 'XX/8/18', 'XX/123/18', 'XXX/88/18', 'XX/68/18', 'XX/145/18', 'YYY/5/18'];
    foreach ($arr as $str){
        $matches = substr($str, strpos($str, "/") + 1).'<br>';
        $variable[] = substr($matches, 0, strpos($matches, "/"));    
    }
    natsort($variable);
    $variable_keys = array_keys($variable);
    $ordered_array = array_replace(array_flip($variable_keys), $arr);
    $ordered_array = array_values($ordered_array);
    print_r($ordered_array);
?>
0 голосов
/ 08 июня 2018

Решение для запросов - это хороший подход и, вероятно, предпочтительный метод, если вы можете понять, как это сделать.Однако, без дополнительной информации, вот PHP-решение, которое даст вам желаемые результаты.

Это решение учитывает либо "/", либо "-" и сохраняет "/" или "- "в отсортированном массиве.Это некрасиво, но работает.

<code>$data = array(
  'XBX/124/18',
  'XX/10/18',
  'XMX/12/18',
  'XX/8/18',
  'XX-123-18',
  'XXX/88/18',
  'XX-68-18',
  'XX-145-18',
  'YYY/5/18'
);


for($i = 0; $i < count($data); $i++){

  if(preg_match('/\//', $data[$i])){

    $data[$i] = preg_replace('/\//', ' ', $data[$i]);
    $parsed[$i] = explode(' ', $data[$i]);
    $parsed[$i][3] = '/';

  }elseif(preg_match('/-/', $data[$i])){

    $data[$i] = preg_replace('/-/', ' ', $data[$i]);
    $parsed[$i] = explode(' ', $data[$i]);
    $parsed[$i][3] = '-';

    }

}

$temp = $parsed;

usort($parsed, function($a, $b){  //Will sort by middle and right values.

  if([$a[1], $a[2]] > [$b[1], $b[2]]){

    return 1;

  }elseif([$a[1], $a[2]] < [$b[1], $b[2]]){

    return -1;

    }else{

      return 0;

    }

});

for($i = 0; $i < count($parsed); $i++){ 

  $sorted[] = $temp[$i][0] . $parsed[$i][3] . $parsed[$i][1] . $parsed[$i][3] . $parsed[$i][2];

}

echo '<pre>';
print_r($sorted);
echo '
';

Будет выведено:

Array
(
    [0] => XBX/5/18
    [1] => XX/8/18
    [2] => XMX/10/18
    [3] => XX/12/18
    [4] => XX-68-18
    [5] => XXX/88/18
    [6] => XX-123-18
    [7] => XX/124/18
    [8] => YYY-145-18
)
0 голосов
/ 08 июня 2018

для заказа, как указано выше

ЗАКАЗАТЬ ПО КОНВЕРТУ (SUBSTRING_INDEX (SUBSTRING_INDEX (имя поля, '/', 2), '/', -1), НЕ ПОДПИСАНО INTEGER)

будетвернуть средние значения в виде целого числа, тогда мы можем заказать его

0 голосов
/ 08 июня 2018

Надеюсь, это поможет вам. Я предполагаю, что col2 - это ваши строковые данные, такие как "XBX / 5/18"

SELECT 
      col1, 
      col2,  
      col3 
FROM 
     table1 
ORDER BY 
     SUBSTRING_INDEX(SUBSTRING_INDEX(col2, "/", 2),"/",-1);

Эта строка поможет вам получить среднее число.

SUBSTRING_INDEX(SUBSTRING_INDEX("XBX/5/18", "/", 2),"/",-1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...