Witam.
Przy użyciu zwykłej funkcji sortowania tablic (array_multisort), kompilator posortował mi jej elementy alfabetycznie. Ja chciałbym nieco zmienić szyk tych elementów, tzn. tak jakby przenieść wcześniej w alfabecie niektóre znaki. Chciałbym, aby podkreślnik _ był przed literami (elementy nie zawierają polskich znaków).
Chciałbym też, aby razem z daną tablicą sortowały się w ten sam sposób inne tablice, czyli wypadałoby zamieszać w to funkcję array_multisort.
Aktualnie mam taki kod:
$array_lowercase = array_map('strtolower', $name);
array_multisort($array_lowercase, $name, $id, $body, $klasy);
Całość działałaby tak:
$tablica = array("ala", "alo", "ali", "al_");
powinna zostać posortowana tak:
al_
ala
ali
alo
Znalazłem coś na ten temat na algorytmy.pl (sortowanie według własnego alfabetu), jednak strona jest płatna, a ja aktualnie nie mam tyle pieniędzy, żeby rozdawać je na prawo i lewo. Może wy coś poradzicie? Może funkcja uksort()? usort()?
Proszę pamiętać, że równolegle powinny się sortować trzy tablice, zachowując wszędzie taką samą kolejność w stosunku do stanu początkowego (czyli: jeśli element 1 z pierwszej tablicy idzie na trzecie miejsce, to to samo się dzieje z elementami '1' w pozostałych tablicach).
Ja na razie mam taki kod:
<?php
header('Content-Type: text/html; charset=utf-8');
$xml = simplexml_load_file("new2.txt");
$ile = count($xml -> string);
foreach ($xml -> string as $value)
{
$id[] = (string)$value -> id;
$name[] = (string)$value -> name;
$body[] = (string)$value -> body;
$klasy[] = (preg_match("/STR_SKILL_([a-z]{2})_(.+)/i", ((string)$value -> name ? preg_replace("/STR_SKILL_([a-z]{2})_(.+)/i", "\\1", (string)$value -> name) : "");
}
$array_lowercase = array_map('strtolower', $name);
array_multisort($array_lowercase, $name, $id, $body, $klasy);
$zapytanie = "";
for($i=0; $i < $ile; $i++)
{
$dab = 0;
$tekst = "";
$tresc = "\"";
$tekst .= "(\"".$id[$i]."\", \"".$name[$i]."\", \"".$klasy[$i]."\", \"".$body[$i]."\", ";
$i++;
if (preg_match("/(.+)_DESC_Abnormal$/i", $name[$i+1]))
{
$tekst .= "\"".$id[$i+1]."\", \"".$name[$i+1]."\", ";
$tresc .= $body[$i+1]."=====";
$dab = 1;
} else if (preg_match("/(.+)_Abnormal$/i", $name[$i]) || preg_match("/(.+)_effect$/i", $name[$i]))
{
$tekst .= "\"".$id[$i]."\", \"".$name[$i]."\", ";
$tresc .= $body[$i]."=====";
} else {
$tekst .= "\"\", \"\", ";
}
if (preg_match("/(.+)_DESC$/i", $name[$i]) || preg_match("/(.+)_area$/i", $name[$i]))
{
$tekst .= "\"".$id[$i]."\", \"".$name[$i]."\", ";
$tresc .= $body[$i]."\")";
if ($dab) $i++;
} else {
$tekst .= "\"\", ";
$tresc .= "\")";
}
$tekst .= $tresc;
$zapytanie .= "$tekst, ";
}
$query = "INSERT INTO sl_skille (`id_z_gry`, `name`, `klasa`, `nazwa_ang`, `id_z_gry_abnormal`, `name_abnormal`, `id_z_gry_desc`, `name_desc`, `opis_ang`) VALUES ". substr($zapytanie, 0, -2).";";
print_r($name); echo "<br/><br/>";
echo $query;
?>
Działa on poprawnie, jednak sortowanie jest nieco inne, niż bym sobie tego życzył.
Wynikiem jest tablica zawierająca na przykład takie elementy:
[30] => STR_ACH_StatupAr_Lr_Nr_Officer [31] => STR_ACH_StatupAr_Lr_Nr_Officer_Abnormal [32] => STR_ACH_StatupAr_Lr_Nr_Officer_DESC [33] => STR_ACH_StatupAr_Lr_Nr_OfficerF [34] => STR_ACH_StatupAr_Lr_Nr_OfficerF2 [35] => STR_ACH_StatupAr_Lr_Nr_OfficerF2_DESC [36] => STR_ACH_StatupAr_Lr_Nr_OfficerF_Abnormal [37] => STR_ACH_StatupAr_Lr_Nr_OfficerF_DESC [38] => STR_ACH_StatupAr_Lr_Nr_QuarterMaster
Zależy mi na tym, aby po 33 znalazł się 37, czyli aby najpierw sortowało F_ (lub po prostu coś zawierającego podkreślnik), a dopiero później resztę, czyli F2, itd.