avk013.blogspot.com - другой мой блог "C# and etc"

четверг, 12 ноября 2015 г.

Сортировка PHP и национальные символы (українська І).

Обзор сайта the-art-of-web.com подтолкнул упорядочить проблемы сортировки (в моем случае украинских слов на UTF)...ну и конечно стандартные способы упорядочивания.
==== сортировка одномерного массива с украинскими буквами (спасибо 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>';?>
до usort($data, 'utf_8_UA::cmp')и после=результат ->>>
============ еще
Итак, имеем исходный массив массива (условно двумерный массив):Использую функцию $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
ЗЫ с иронией: Можете называть это говнокодом, НУ не нашел я нормально действующих аналогов, и было бы ценно указывать несколько столбиков, по которым будет сортировка:)

Комментариев нет:

Отправить комментарий