Mehrdimensionales Array Sortieren

Alles, was PHP betrifft, kann hier besprochen werden.

Mehrdimensionales Array Sortieren

Postby Knight1 » 17. August 2008 11:27

Hi AF-Com,
ich habe da folgendes Problem.
In meinem aktuellen Projekt habe ich mir die ganzen Länder der Erde in die Sprachdatei übernommen.

Das Array sieht folgendermaßen aus:
Code: Select all
$language['global']['countries']['0']['name']['short'] = "Afghanistan";
$language['global']['countries']['0']['name']['long'] = "Islamische Republik Afghanistan";
$language['global']['countries']['0']['iso_3166_1']['alpha_2'] = "AF";
$language['global']['countries']['0']['iso_3166_1']['alpha_3'] = "AFG";
$language['global']['countries']['0']['iso_3166_1']['numeric'] = "004";
$language['global']['countries']['0']['country_std'] = "+93";
$language['global']['countries']['0']['timezone']['summer']['start'] = "+4:30"; // Basis: UTC
$language['global']['countries']['0']['timezone']['summer']['end'] = "+4:30"; // Basis: UTC
$language['global']['countries']['0']['timezone']['winter']['start'] = "+4:30"; // Basis: UTC
$language['global']['countries']['0']['timezone']['winter']['end'] = "+4:30"; // Basis: UTC
$language['global']['countries']['0']['flag']['id'] = "3";
.
.
.
$language['global']['countries']['191']['name']['short'] = "Zypern";
$language['global']['countries']['191']['name']['long'] = "Republik Zypern";
$language['global']['countries']['191']['iso_3166_1']['alpha_2'] = "CY";
$language['global']['countries']['191']['iso_3166_1']['alpha_3'] = "CYP";
$language['global']['countries']['191']['iso_3166_1']['numeric'] = "169";
$language['global']['countries']['191']['country_std'] = "+357";
$language['global']['countries']['191']['timezone']['summer']['start'] = "+2"; // Basis: UTC
$language['global']['countries']['191']['timezone']['summer']['end'] = "+2"; // Basis: UTC
$language['global']['countries']['191']['timezone']['winter']['start'] = "+2"; // Basis: UTC
$language['global']['countries']['191']['timezone']['winter']['end'] = "+2"; // Basis: UTC
$language['global']['countries']['191']['flag']['id'] = "183";


Jetzt habe ich das Problem dass die Numerischen Indizes nicht der Alphabetischen Reihenfolge des Index ['name']['short'] entsprechen.
Daher möchte ich nach ['name']['short'] Sortieren, aber unter Beibehaltung der zugehörigen restlichen Werte und mit Einbeziehung des Numerischen Indexes (Soll heißen, der nummerische Index soll dann als neuer Index in dem neuen Array vorhanden sein).
Ich bin schon seit Tagen am überlegen wie ich das machen kann, habe aber keinen Plan wie.
Ich vermute mal es wird auf eine Schleife hinauslaufen.

Für Denkanstöße wäre ich Euch sehr vebunden.


Kai aka Knight1
Image
User avatar
Knight1
 
Posts: 310
Joined: 18. October 2003 10:03
Location: Trier
Operating System: Windows 7 Ultimate x64

Postby Xardas der Dunkle » 17. August 2008 11:34

Erstmal wieso deklarierst du Numerische Indizes als Text?

Was du suchst ist: http://de3.php.net/manual/de/function.usort.php

Code: Select all
function sortMultilang($a, $b) {
    return strcmp($a['name']['short'], $b['name']['short']);
}

usort($language['global']['countries'], 'sortMultilang');
User avatar
Xardas der Dunkle
 
Posts: 482
Joined: 09. March 2008 19:40
Location: /var/www

Postby Knight1 » 17. August 2008 11:44

Xardas der Dunkle wrote:Was du suchst ist: http://de3.php.net/manual/de/function.usort.php

Code: Select all
function sortMultilang($a, $b) {
    return strcmp($a['name']['short'], $b['name']['short']);
}

usort($language['global']['countries'], 'sortMultilang');


Das funzt super, danke.

Xardas der Dunkle wrote:Erstmal wieso deklarierst du Numerische Indizes als Text?


Die Frage verstehe ich nicht ganz.


Kai aka Knight1
Image
User avatar
Knight1
 
Posts: 310
Joined: 18. October 2003 10:03
Location: Trier
Operating System: Windows 7 Ultimate x64

Postby Xardas der Dunkle » 17. August 2008 11:51

Code: Select all
['191']
sollte eig. so aussehen:
Code: Select all
[191]
User avatar
Xardas der Dunkle
 
Posts: 482
Joined: 09. March 2008 19:40
Location: /var/www

Postby Knight1 » 17. August 2008 12:09

Xardas der Dunkle wrote:
Code: Select all
['191']
sollte eig. so aussehen:
Code: Select all
[191]


Achso, ist Angewohnheit.

Aber wie bekomme ich den Schlüssel, z.b. hier die 191, als Wert in den Schlüssel ['country_id']?


Kai aka Knight1
Image
User avatar
Knight1
 
Posts: 310
Joined: 18. October 2003 10:03
Location: Trier
Operating System: Windows 7 Ultimate x64

Postby Xardas der Dunkle » 17. August 2008 12:45

Da muss nun wirklich ne Schleife dran glauben:
Code: Select all
for($i=0; $i<count($language['global']['countries']); $i++) {
    $language['global']['countries'][ $i ]['country_id'] = $i;
}
User avatar
Xardas der Dunkle
 
Posts: 482
Joined: 09. March 2008 19:40
Location: /var/www

Postby Knight1 » 17. August 2008 13:23

Dein Vorschlag hat mich auf eine Idee gebracht.
Wobei ich nicht die Index-Nummer nach dem Sortiern haben will, sondern die Nummer davor.

Ich habe das ganze in eine Methode gepackt. Die Methode sieht folgendermaßen aus:
Code: Select all
<?
class common
{
 function countries_sort ()
 {
 $countries = $GLOBALS['language']['global']['countries'];
  function sortMultilang($a, $b)
  {
  RETURN strcmp($a['name']['short'], $b['name']['short']);
  }
 usort($GLOBALS['language']['global']['countries'], 'sortMultilang');
  for ($x="0";$x<count($countries);$x++)
  {
   for ($y="0";$y<count($GLOBALS['language']['global']['countries']);$y++)
   {
    if ($countries[$x]['name']['short'] == $GLOBALS['language']['global']['countries'][$y]['name']['short'])
    {
    $GLOBALS['language']['global']['countries'][$y]['country_id'] = $x;
    }
   }
  }
 }

.
.
.
?>


So funktioniert's einwandfrei.

Danke "Xardas der Dunkle" für Deine Hilfe.


Kai aka Knight1
Image
User avatar
Knight1
 
Posts: 310
Joined: 18. October 2003 10:03
Location: Trier
Operating System: Windows 7 Ultimate x64

Postby Xardas der Dunkle » 17. August 2008 13:34

ARGH bei so einem Code kriege ich n' Heulkrampf xD.
Vor allem was sollen die 2 Forschleifen???

Code: Select all
<?php
class Common {
    function country_multi_sort($a, $b) {
        return strcmp($a['name']['short'], $b['name']['short']);
    }

    function county_sort() {
        $countries = &$GLOBALS['language']['global']['countries'];
        usort($countries, Array($this, 'country_multi_sort'));
        for($i=0; $i<count($countries); $i++) {
            $countries[$i]['country_id'] = ($i - 1);
        }
    }
}
User avatar
Xardas der Dunkle
 
Posts: 482
Joined: 09. March 2008 19:40
Location: /var/www

Postby Knight1 » 17. August 2008 13:46

Sorry, habe gerade festgestellt dass das mit der Übernahme der Index-Nummern nicht nötig ist.
Da ich die Sortierung schon ziemlich früh am Anfang das Scripts vornehme, steht mir ja auch nur die sortierte "Version" zur Vefügung und das zur ganzen Laufzeit in allen Dateien. Daher brauche ich mir die ursprüngliche Index-Nummerierung nicht merken.

Trotzdem Danke


Kai aka Knight1
Image
User avatar
Knight1
 
Posts: 310
Joined: 18. October 2003 10:03
Location: Trier
Operating System: Windows 7 Ultimate x64


Return to PHP

Who is online

Users browsing this forum: No registered users and 2 guests