sort pola podla slovenskej abecedy

Programovacie jazyky, rady, poradňa...
handasse
Novice
Novice
Príspevky: 2
Registrovaný: 29 sep 2006, 8:50
Kontaktovať používateľa:

sort pola podla slovenskej abecedy

Príspevok od používateľa handasse »

Zdravim vsetkych... Neviete mi podardit niekto akym sposobom mam zmenit setlocale, aby mi pole triedilo podla SK abecedy - teda aj s diakritikou?
pre ukazku kusok kodu:
<?
$abeceda="A Á Ä B C Č D Ď Dz Dž E É F G H Ch I Í J K L Ĺ Ľ M N Ň O Ó Ô P R Ŕ S Š T Ť U Ú V X Y Ý Z Ž"; // takta je SK abeceda
$array_slova=split(" ", $abeceda);
sort ($array_slova);

for ($j=0;$j <= count ($array_slova); $j++){
echo "$array_slova[$j]";
}
?>

Vdaka pekne

PS: skusal som pridat na zaciatok
locale.setlocale(locale.LC_CTYPE, 'sk_SK.utf-8');
ale nepomoholo to :(
IgiPoP
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 446
Registrovaný: 12 sep 2005, 8:17
Bydlisko: MT

Príspevok od používateľa IgiPoP »

php nepozna slovencinu, tak je nutne si vytvorit vlastne zoradovanie

mal som trocha casu, tak som ti to urobil:

Kód: Vybrať všetko

// code
<?php
function slovakSort($arr)
{
  $vystup = Array();
  
  foreach( $arr as $k => $v )
  {
    if( empty($vystup) )
    {
      $vystup[] = $v;
    }
    else
    {
      foreach( $vystup as $key => $value )
      {
        if( word($v, $value) == 1 )
        {
          array_splice($vystup, $key, 0, $v);
          $vlozene = true;
          break;
        }
        elseif( word($v, $value) == 0 )
        {
          array_splice($vystup, ($key+1), 0, $v);
          $vlozene = true;
          break;
        }
      }
      if( !$vlozene )
        $vystup[] = $v;
      else
        $vlozene = false;
    }
  }
  return $vystup;
}

function word($first, $second)
{
  $abeceda = "A a Á á Ä ä B b C c Č č D d Ď ď Dz dz Dž dž E e É é F f G g H h Ch ch I i Í í J j K k L l Ĺ ĺ Ľ ľ M m N n Ň ň O o Ó ó Ô ô P p R r Ŕ ŕ S s Š š T t Ť ť U u Ú ú V v X x Y y Ý ý Z z Ž ž";
  $abeceda = split( " ", $abeceda );
  $abeceda = array_flip($abeceda);
  $vystup = 0;
  $n = strlen($first);
  if( strlen($first) < strlen($second)  )
  {
    $n = strlen($first);
    $vystup = 1;
  }
  elseif( strlen($first) > strlen($second)  )
  {
    $n = strlen($second);
    $vystup = -1;
  }
  for( $i=0; $i<$n; $i++ )
  {
    $j = $i + 1;
    if( array_key_exists( substr($first, $i, 2), $abeceda ) )
      $fChar = substr($first, $i, 2);
    elseif( array_key_exists( substr($first, $i, 3), $abeceda ) )
      $fChar = substr($first, $i, 3);
    else
      $fChar = $first[$i];
    if( array_key_exists( substr($second, $i, 2), $abeceda ) )
      $sChar = substr($second, $i, 2);
    elseif( array_key_exists( substr($second, $i, 3), $abeceda ) )
      $sChar = substr($second, $i, 3);
    else
      $sChar = $second[$i];
    if( $abeceda[$fChar] > $abeceda[$sChar] )
    {
      $vystup = -1;
      break;
    }
    elseif( $abeceda[$fChar] < $abeceda[$sChar] )
    {
      $vystup = 1;
      break;
    }
  }
  return $vystup;
}

$pole = Array( "Žaneta", "Džungľa", "Ďakujem", "Chasník", "Ciril", "Žofia", "Alexandra", "Želka", "Sofia" );
$nieco = slovakSort($pole);
print_r($nieco);
?>

Kód: Vybrať všetko

//vystup
Array
(
    [0] => Alexandra
    [1] => Ciril
    [2] => Ďakujem
    [3] => Džungľa
    [4] => Chasník
    [5] => Sofia
    [6] => Žaneta
    [7] => Želka
    [8] => Žofia
)
good luck.
handasse
Novice
Novice
Príspevky: 2
Registrovaný: 29 sep 2006, 8:50
Kontaktovať používateľa:

Príspevok od používateľa handasse »

Velmi pekne dakujem IgiPoP za cas a odpoved. Presne to som potreboval a sam som to urobit nevedel. Este raz vrela vdaka. :smt023
mastermind
VIP
VIP
Používateľov profilový obrázok
Príspevky: 4810
Registrovaný: 09 feb 2005, 13:17

Príspevok od používateľa mastermind »

ak by si nepotreboval pismena Dz a Ch tak skus tento sposob. na danej vzorke je asi 6-10x rychlejsi.
ak mas php 4 tak mozno budes musiet prepisat trosku triedu.

Kód: Vybrať všetko

<?php
class SlovakSort
{
	private $abeceda = "A a Á á Ä ä B b C c Č č D d Ď ď E e É é F f G g H h  I i Í í J j K k L l Ĺ ĺ Ľ ľ M m N n Ň ň O o Ó ó Ô ô P p R r Ŕ ŕ S s Š š T t Ť ť U u Ú ú V v X x Y y Ý ý Z z Ž ž";

public function SlovakSort()
	{
	$this->abeceda= array_flip(split(" ", $this->abeceda));
	}
public function SortArray(&$array)
{
	usort($array,array("SlovakSort", "cmpString"));
} 
	
private function cmpString($first,$second,$counter=0)
{
if ($first[$counter]==="") return -1;
if ($second[$counter]==="") return 1;
if ($this->abeceda[$first[$counter]] <$this->abeceda[$second[$counter]]) return -1;
if ($this->abeceda[$first[$counter]] >$this->abeceda[$second[$counter]]) return 1; 
else return $this->cmpString($first,$second,$counter+1);
}	
}


$start=microtime(true);
$sort=new SlovakSort();
$pole = Array( "Žaneta", "Džungľa", "Ďakujem", "Chasník", "Ciril", "Žofia", "Alexandra", "Želka", "Sofia" );
$sort->SortArray($pole);

$end=microtime(true);
print_r($pole);
echo $end-$start;
?>
IgiPoP
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 446
Registrovaný: 12 sep 2005, 8:17
Bydlisko: MT

Príspevok od používateľa IgiPoP »

mastermind napísal:ak by si nepotreboval pismena Dz a Ch tak skus tento sposob. na danej vzorke je asi 6-10x rychlejsi.
ak mas php 4 tak mozno budes musiet prepisat trosku triedu.
skusil som to a prestne som vedel co sa stane

Kód: Vybrať všetko

// vysledok
Array
(
    [0] => Ďakujem
    [1] => Žaneta
    [2] => Želka
    [3] => Žofia
    [4] => Alexandra
    [5] => Chasník
    [6] => Ciril
    [7] => Džungľa
    [8] => Sofia
)
problem je v kodovani, pretoze v UTF-8 znak s makcenom zabera 2 miesta. prvy sa zobrazuje ako ? a druhy ako pismeno bez makcena.
mastermind
VIP
VIP
Používateľov profilový obrázok
Príspevky: 4810
Registrovaný: 09 feb 2005, 13:17

Príspevok od používateľa mastermind »

hmm nie som teraz doma takze to nemozem vyskusat, ale hovoris ze ta trieda co som poslal nefunguje? skusal som to doma a islo to v pohode...

//add: mno posledny vysledok vyzera nejako takto

Kód: Vybrať všetko

Array ( [0] => Alexadra [1] => Alexandra [2] => Chasn [3] => Chasník [4] => Ciril [5] => Ciril [6] => Džung¾ [7] => Džung¾a [8] => Ïakuje [9] => Ïakujem [10] => Sofia [11] => Sofia [12] => Žanet [13] => Žaneta [14] => Želka [15] => Žka [16] => Žofia [17] => Žoia ) 0.00108885765076
IgiPoP
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 446
Registrovaný: 12 sep 2005, 8:17
Bydlisko: MT

Príspevok od používateľa IgiPoP »

mastermind napísal:hmm nie som teraz doma takze to nemozem vyskusat, ale hovoris ze ta trieda co som poslal nefunguje? skusal som to doma a islo to v pohode...
nehovorim, ze nefunguje, ale vysledok je ovplyvneny zvolenym kodovanim php dokumentu.
napr. v utf-8 kodovani znak s makcenom, dlznom zabera velkost dvoch znakov, cize strlen("Ďakujem") ti v utf-8 vrati 8, ale pritom je tam iba 7 pismen. v takychto pripadoch by sa malo pouzivat mb_strlen("Ďakujem");
mastermind
VIP
VIP
Používateľov profilový obrázok
Príspevky: 4810
Registrovaný: 09 feb 2005, 13:17

Príspevok od používateľa mastermind »

fiha to som nevedel. dakujem pekne za nejake nove info.
karma +
Napísať odpoveď