1 Востаннє редагувалося TzaR (15.10.2014 11:42:33)

Тема: сортування української абетки в масиві

є масив
форми

array 
  'displayname' => 
    array 
      0 => string 'Аритиченк' 
      1 => string 'Івашин' 
      2 => string 'Ващенк' 
      3 => string 'Івк' 
      4 => string 'Єлюхін'
      5 => string 'Ясаєв' 
  'mail' => 
    array
      0 => string 'ar@domen.com'
      1 => string 'ivashi@domen.com'
      2 => string 'vashche@domen.com'
      3 => string 'ivk@domen.com'
      4 => string 'el@domen.com'
      5 => string 'yas@domen.com'

як сортувати його зміст по прізвищу, з урахуванням "І", "Є"?
sort() і інші ігнорують "і/є" виводячи їх першими

Знайшов таку функцію:

    function sort_uk( $a, $b ){
   $a = mb_strtoupper ( $a, 'UTF-8' );
   $b = mb_strtoupper ( $b, 'UTF-8' );
   $alphabet = array(
       'А' => 1, 'Б' => 2, 'В' => 3, 'Г' => 4, 'Д' => 5, 'Е' => 6, 'Є' => 7, 'Ж' => 8, 'З' => 9, 'И' => 10, 'І' => 11,
       'Ї' => 12, 'Й' => 13, 'К' => 14, 'Л' => 15, 'М' => 16, 'Н' => 17, 'О' => 18, 'П' => 19, 'Р' => 20, 'С' => 21, 'Т' => 22,
       'У' => 23, 'Ф' => 24, 'Х' => 25, 'Ц' => 26, 'Ч' => 27, 'Ш' => 28, 'Щ' => 29, 'Ь' => 30, 'Ю' => 31, 'Я' => 32
   );
   $lengthA = mb_strlen ( $a, 'UTF-8' );
   $lengthB = mb_strlen ( $b, 'UTF-8' );
   for( $i = 0; $i < ( $lengthA > $lengthB? $lengthB : $lengthA ); $i++ ){
       if ( $alphabet[ mb_substr( $a, $i, 1, 'UTF-8' ) ] < $alphabet[ mb_substr( $b, $i, 1, 'UTF-8' ) ] ){
           $status = -1;
           break;
       }
       elseif ( $alphabet[ mb_substr( $a, $i, 1, 'UTF-8' ) ] > $alphabet[ mb_substr( $b, $i, 1, 'UTF-8' ) ] ){
           $status = 1;
           break;
       }
       else{
           $status = 0;
       }
   }
   return $status;
}

максимум що вдалося, це сортувати окремо перелік прізвищ, але з втратою зв'язків з іншими даними.

Питання, як відсортувати масив за стовпцем "displayname", засобами php.

2 Востаннє редагувалося VTrim (15.10.2014 13:04:22)

Re: сортування української абетки в масиві

Тому,що потрібно сортувати з українською локалізацією.

<?php

setlocale(LC_ALL, 'ukr');

$displayname = array('Ващенк','Єлюхін','Аритиченк','Ясаєв','Івк');

sort($displayname,SORT_LOCALE_STRING);

echo '<pre>';
print_r($displayname);
echo '</pre>';
Подякували: TzaR1

3

Re: сортування української абетки в масиві

Прихований текст
<?php
 
setlocale(LC_ALL, 'ukr');
 
$displayname = array('ващенк','єлюхін','аритиченк','ясаєв','івк');
 
sort($displayname,SORT_LOCALE_STRING);
 
echo '<pre>';
print_r($displayname);
echo '</pre>';




setlocale(LC_ALL, 'ukr');
 
$displayname = array('Ващенк','Єлюхін','Аритиченк','Ясаєв','Івк');
 
sort($displayname,SORT_LOCALE_STRING);
 
echo '<pre>';
print_r($displayname);
echo '</pre>';
?>

отримуємо :

Array
(
    [0] => аритиченк
    [1] => ващенк
    [2] => івк
    [3] => єлюхін
    [4] => ясаєв
)
Array
(
    [0] => Ващенк
    [1] => Єлюхін
    [2] => Івк
    [3] => Аритиченк
    [4] => Ясаєв
)

Зверніть увагу на "Аритиченко"
думав може англійська А, переввів нічого не змінилось

4 Востаннє редагувалося VTrim (15.10.2014 13:57:46)

Re: сортування української абетки в масиві

Я ж вам дав робочий приклад. Яка різниця який регістр.
У мене все правильно

Array
(
    [0] => аритиченк
    [1] => ващенк
    [2] => єлюхін
    [3] => івк
    [4] => ясаєв
)
Array
(
    [0] => Аритиченк
    [1] => Ващенк
    [2] => Єлюхін
    [3] => Івк
    [4] => Ясаєв
)

5 Востаннє редагувалося TzaR (17.10.2014 17:04:21)

Re: сортування української абетки в масиві

Дякую,
як тепер сортувати масив в 1му пості щоб і пошта впорядкувалась відповідно до ПІБ?

6

Re: сортування української абетки в масиві

TzaR написав:

Дякую,
як тепер сортувати масив в 1му пості щоб і пошта впорядкувалась відповідно до ПІБ?

<?php
 
setlocale(LC_ALL, 'ukr');
 
$displayname = array('ващенк','єлюхін','аритиченк','ясаєв','івк');
 
sort($displayname,SORT_LOCALE_STRING);
 
echo '<pre>';
print_r($displayname);
echo '</pre>';
 
setlocale(LC_ALL, 'us');
 
$mail = array('ivashi@domen.com','vashche@domen.com','ivk@domen.com','yas@domen.com','ar@domen.com');
 
sort($mail,SORT_LOCALE_STRING);
 
echo '<pre>';
print_r($mail);
echo '</pre>';

7 Востаннє редагувалося koala (17.10.2014 18:37:53)

Re: сортування української абетки в масиві

А якщо так:

//$people - ваш масив
$people['displayname']=('ващенк','єлюхін','аритиченк','ясаєв','івк');
$people['mail']=array('ivashi@domen.com','vashche@domen.com','ivk@domen.com','yas@domen.com','ar@domen.com');
//приводимо до "нормального" вигляду:
$people_by_displayname = array_combine( people['displayname'], people['mail'] );
//сортуємо за ключами
uksort( $people_by_displayname,  sort_uk );
//якщо треба - розбираємо на окремі масиви
$people['displayname']=array_keys  ( $people_by_displayname );
$people['mail'       ]=array_values( $people_by_displayname );
Подякували: TzaR1

8

Re: сортування української абетки в масиві

koala написав:

А якщо так:

дякую, те що треба