Обзор сайта the-art-of-web.com подтолкнул упорядочить проблемы сортировки (в моем случае украинских слов на UTF)...ну и конечно стандартные способы упорядочивания.
==== сортировка одномерного массива с украинскими буквами (спасибо w-dot-rosenbach-at-netskill-de за мотивы)
Итак, имеем исходный массив массива (условно двумерный массив):Использую функцию $data=sort_array2x($data,1) где 1- номер второго столбца.
=========сортировка двумерного массива по номеру столбца с нац.символами
(С) Коваленко Александр. avk013
ЗЫ с иронией: Можете называть это говнокодом, НУ не нашел я нормально действующих аналогов, и было бы ценно указывать несколько столбиков, по которым будет сортировка:)
==== сортировка одномерного массива с украинскими буквами (спасибо w-dot-rosenbach-at-netskill-de за мотивы)
<?php mb_internal_encoding("UTF-8"); $data = array( 'Юлія', 'Йосип', 'Олександр', 'Іван', 'Борислав', 'Єва'); function out1($data) {$tab='<table border="1" cellpadding="1" cellspacing="0"><tr>'; for($i=0;$i<count($data);$i++) $tab.='<td>'.$data[$i].'</td></tr><tr>'; $tab.='</tr></table>'; return $tab;} class utf_8_UA { // everything else is sorted at the end static $order = '0123456789АаБбВвГгДдЕеЄєЖжЗзИиІіЇїЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЬьЮюЯя'; static $char2order; static function cmp($a, $b) { if ($a == $b) return 0; // lazy init mapping if (empty(self::$char2order)) { $order = 1; $len = mb_strlen(self::$order); for ($order=0; $order<$len; ++$order) self::$char2order[mb_substr(self::$order, $order, 1)] = $order;} $len_a = mb_strlen($a); $len_b = mb_strlen($b); $max=min($len_a, $len_b); for($i=0; $i<$max; ++$i) { $char_a= mb_substr($a, $i, 1); $char_b= mb_substr($b, $i, 1); if ($char_a == $char_b) continue; $order_a = (isset(self::$char2order[$char_a])) ? self::$char2order[$char_a] : 9999; $order_b = (isset(self::$char2order[$char_b])) ? self::$char2order[$char_b] : 9999; return ($order_a < $order_b) ? -1 : 1;} return ($len_a < $len_b) ? -1 : 1; }} echo '<table><tr><td>'.out1($data).'</td><td>'; usort($data, 'utf_8_UA::cmp'); echo out1($data).'</td></tr></table>';?>============ еще
Итак, имеем исходный массив массива (условно двумерный массив):Использую функцию $data=sort_array2x($data,1) где 1- номер второго столбца.
=========сортировка двумерного массива по номеру столбца с нац.символами
<?php mb_internal_encoding("UTF-8"); $data = array( array(1,"Юлія","Іванова",13), array(2,"Йосип","Міллєр",19), array(3,"Олександр","Коваленко",11), array(4,"Іван","Мачула",27), array(5,"Борислав","Єль",33), array(6,"Єва","Дзюба",49)); function out($data) {$tab='<table border="1" cellpadding="1" cellspacing="0"><tr>'; for($i=0;$i<count($data);$i++) {for($j=0;$j<count($data[0]);$j++) $tab.='<td>'.$data[$i][$j].'</td>'; $tab.='</tr><tr>';} $tab.='</tr></table>'; return $tab;} class utf_8_UA { // everything else is sorted at the end static $order = '0123456789АаБбВвГгДдЕеЄєЖжЗзИиІіЇїЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЬьЮюЯя'; static $char2order; static function cmp($a, $b) { if ($a == $b) return 0; // lazy init mapping if (empty(self::$char2order)) { $order = 1; $len = mb_strlen(self::$order); for ($order=0; $order<$len; ++$order) self::$char2order[mb_substr(self::$order, $order, 1)] = $order;} $len_a = mb_strlen($a); $len_b = mb_strlen($b); $max=min($len_a, $len_b); for($i=0; $i<$max; ++$i) { $char_a= mb_substr($a, $i, 1); $char_b= mb_substr($b, $i, 1); if ($char_a == $char_b) continue; $order_a = (isset(self::$char2order[$char_a])) ? self::$char2order[$char_a] : 9999; $order_b = (isset(self::$char2order[$char_b])) ? self::$char2order[$char_b] : 9999; return ($order_a < $order_b) ? -1 : 1; } return ($len_a < $len_b) ? -1 : 1; }} function conv21($data,$st) //преобразуем 2х в 1х и переносим вперед главный столбец {for($i=0;$i<count($data);$i++) {$a=$data[$i][$st];$data[$i][$st]=$data[$i][0];$data[$i][0]=$a;} $ii=0;for($i=0;$i<count($data);$i++) for($j=0;$j<count($data[0]);$j++) if($j<count($data[0])-1) $ndata[$i].=$data[$i][$j].'|'; else $ndata[$i].=$data[$i][$j]; return $ndata;} function conv22($data, $st) //преобразуем 1х в 2х и возвращаем столбцы {for($i=0;$i<count($data);$i++) $ndata[$i]=explode("|",$data[$i]); for($i=0;$i<count($data);$i++) {$a=$ndata[$i][$st];$ndata[$i][$st]=$ndata[$i][0];$ndata[$i][0]=$a;} return $ndata;} function sort_array2x($data,$st) {$data=conv21($data,$st);usort($data, 'utf_8_UA::cmp');$data=conv22($data,$st); return $data;} echo '<table><tr><td>'.out($data).'</td><td>'; $data=sort_array2x($data,1); echo out($data).'</td><td>'; $data=sort_array2x($data,2); echo out($data).'</td><td>'; $data=sort_array2x($data,3); echo out($data).'</td></tr></table>';?>__________________________
(С) Коваленко Александр. avk013
ЗЫ с иронией: Можете называть это говнокодом, НУ не нашел я нормально действующих аналогов, и было бы ценно указывать несколько столбиков, по которым будет сортировка:)
Комментариев нет:
Отправить комментарий