2016-08-30 3 views
1

Я хотел бы отсортировать следующий массив по второму символу [1] (от 1 до D):

$_SESSION['kartenstapel']=array(
       '11','12','13','14','15','16','17','18','19','1A','1B','1C','1D', 
       '21','22','23','24','25','26','27','28','29','2A','2B','2C','2D', 
       '31','32','33','34','35','36','37','38','39','3A','3B','3C','3D', 
       '41','42','43','44','45','46','47','48','49','4A','4B','4C','4D', 
       '51','52','53','54','55','56','57','58','59','5A','5B','5C','5D', 
       'W1','W2','W3','W4','W5','W6','W7','W8','W9','WA','WB','WC','WD' 
); 

Идеальный выходной будет следующее:

$_SESSION['kartenstapel']=array(
       '11','21','31','41','51','W1','12','22','32','42','52','W2','13'... 
+1

Используйте 'usort()' и примените к нему свою настраиваемую функцию сортировки. – Rizier123

+0

Он работает! Спасибо, что указали это! – Alexander

ответ

1

Вы можете использовать функцию usort передать свой собственный пользовательский сравнения-функции.

Здесь нужно иметь в виду несколько вещей. Первое, что вам нужно сравнить, это символ [1]. Однако, естественно, D не приходит после 1 (например), поэтому вам нужно будет сделать некоторые манипуляции. Чистый прием заключается в том, чтобы рассматривать этот символ как шестнадцатеричное число (например, используя base_convert и преобразовывая его в целое число. Во-вторых, если второй символ второй строки одинаковый, вы хотите сортировать лексикографически, то есть просто вернуть результат . от strcmp Когда вы все это вместе, вы получите что-то вроде этого:

usort($_SESSION['kartenstapel'], function ($a, $b) { 
    $cmp = base_convert($a[1], 16, 10) - base_convert($b[1], 16, 10); 
    if ($cmp != 0) { 
     return $cmp; 
    } 
    return strcmp($a, $b); 
}); 
+1

Спасибо вам за хорошее объяснение! Я буду использовать вашу функцию. :) – Alexander

1

Поскольку у них всего два символа, похоже, что вы можете просто сортировать, сравнивая обратную сторону каждой строки.

usort($_SESSION['kartenstapel'], function($a, $b) { 
    return strcmp(strrev($a), strrev($b)); 
}); 
Смежные вопросы