У меня есть такая строка:
{{14,2,53045,2,1,0,156,100,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53045,2,1,0,168,500,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1},
{14,2,53045,2,1,0,168,200,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1},
{14,2,53045,2,1,0,97,200,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53139,2,1,0,467,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53139,2,1,0,467,1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53139,2,1,0,467,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53139,2,1,0,467,3,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0}}
Но мне нравится, когда все 8 строк упорядочиваются по 3-му, а затем 7-м и 8-м значениям, поэтому результат будет:
{{14,2,53139,2,1,0,467,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53139,2,1,0,467,1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53139,2,1,0,467,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53139,2,1,0,467,3,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0
{14,2,53045,2,1,0,156,100,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53045,2,1,0,168,500,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1},
{14,2,53045,2,1,0,168,200,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1},
{14,2,53045,2,1,0,97,200,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0}}
Есть ли у кого-нибудь идеи, как этого добиться?
Заранее спасибо,
Андреас
редактировать:
SQLite запрос:
select owner, '{{' ||
group_concat(
event||','||parent||','||key||','||target||','||tick_count||','||tick_interval||','
||ifnull(arg1,'NULL')||','||ifnull(arg2,'NULL')||','||ifnull(arg3,'NULL')||','||ifnull(arg4,'NULL')||','
||ifnull(arg5,'NULL')||','||ifnull(arg6,'NULL')||','||ifnull(arg7,'NULL')||','||ifnull(arg8,'NULL')||','
||ifnull(arg9,'NULL')||','||ifnull(arg10,'NULL')||','||ifnull(arg11,'NULL')||','||ifnull(arg12,'NULL')||','
||ifnull(arg13,'NULL')||','||ifnull(arg14,'NULL')||','||ifnull(arg15,'NULL')||','||hasReq, '},{')||'}}' as key_value_pairs
from items_functions WHERE owner = 281201 group by owner
да, было бы намного проще, если бы это был настоящий JSON
Это результат моего запроса SQLite. Но предложение order by не работает с group_concat, поэтому я подумал, что нужно упорядочить результат. добавил запрос к моему сообщению.
Если вы используете [...], а не {...}, вы можете преобразовать его в массив массивов с помощью json_decode, а затем использовать эту ссылку для его сортировки: stackoverflow.com/questions/17364127/…
Зачем вообще нужно объединять его с псевдо-JSON в базе данных? Получите его как массивы из базы данных, отсортируйте его (почему бы вам тоже не сделать это в запросе?!), Затем закодируйте его в любой строковый формат, который вам нужен в PHP.
Я бы использовал ответ @deceze в связанном вопросе (с usort() и оператором космического корабля), но вы должны отсортировать его в своем запросе SQL
Почему 156 сортирует до 168, а 97 - после него? Вы действительно этого хотите?
Спасибо за ответы. Что ж, это разные подходы, которые стоит попробовать. Но, к сожалению, не ответил на мой вопрос. Не поймите меня неправильно, я им благодарен. Но все же я хотел бы знать, как этого добиться, как я описал. @Nick ну на самом деле мне просто нужно отсортировать по значению 3 DESC.
Сортировать это как строку было бы очень сложно. По крайней мере, вам нужно будет разбить его на отдельные строки, которые будут отсортированы может, затем отсортировать их (например, используя usort, разбив строки больше, чтобы получить правильные значения для сравнения), затем вам нужно собрать его обратно в желаемый строковый формат.






Этот код будет делать то, о чем вы просили (упорядочивая элементы в строке по убыванию значения 3), в зависимости от вашего вопроса. Как было указано в комментариях, вероятно, есть много лучших способов сделать это, начиная с переписывания запроса. Однако, не видя, как вы используете данные, трудно сказать, как лучше всего их переписать.
$data = '{{14,2,53045,2,1,0,156,100,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53045,2,1,0,168,500,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1},
{14,2,53045,2,1,0,168,200,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1},
{14,2,53045,2,1,0,97,200,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53139,2,1,0,467,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53139,2,1,0,467,1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53139,2,1,0,467,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53139,2,1,0,467,3,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0}}';
$json = str_replace(array('{', '}', 'NULL'), array('[', ']', '"NULL"'), $data);
$arr = json_decode($json);
//print_r($arr);
// sort based on element 3 descending
usort($arr, function ($a, $b) { return - ($a[2] <=> $b[2]); });
//print_r($arr);
$json = json_encode($arr);
$data = str_replace(array('[', ']', '"NULL"'), array('{', '}', 'NULL'), $json);
print_r($data);
Выход:
{{14,2,53139,2,1,0,467,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53139,2,1,0,467,1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53139,2,1,0,467,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53139,2,1,0,467,3,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53045,2,1,0,156,100,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53045,2,1,0,168,500,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1},
{14,2,53045,2,1,0,168,200,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1},
{14,2,53045,2,1,0,97,200,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0}}
Большое спасибо, Ник!
Это похоже на JSON, но не совсем. Можно ли преобразовать этот формат в массив / объект…?