Array sortieren

ghostadmin

Grand Admiral Special
Mitglied seit
11.11.2001
Beiträge
25.209
Renomée
190
Standort
Dahoam Studios
Ich habe in php ein array das ich so erzeugt habe:
exec("/usr/sbin/asterisk -rx 'database show cidname'", $cid);

Da stehen die Daten in der Form drin:
telefonnr1 name1
telefonnr2 name2

Kann man die "Zeilen" auch nach Namen sortieren?
Der normale sort command geht anscheinend nur beim ersten feld (ohne es ausprobiert zu haben).

Ausgeben tue ich das ganze so:
Code:
$search2 = "/[^0-9]/";
$search3 = "/[0-9]/";
$i = 0;
while ($cid[$i])
{

$cid2 = preg_replace($search2,"",$cid[$i]);
$cid3 = preg_replace($search3,"",$cid[$i]);

if($cid3 != " results found.") {
print "<a href='ctd-form.php?PhoneNumber=$cid2'>$cid2</a>";
} else {
echo $cid2;
}

echo $cid3.'<br>';

$i = $i + 1;
}
 
Ich weiß zwar nicht, ob ein Sortieren des Ergebnisses mit PHP schneller ginge oder weniger belastend wäre als die Benutzung einer Pipe, aber sort kann natürlich auch nach anderen Spalten als der ersten sortieren:
sort --help schrieb:
-k, --key=POS1[,POS2] start a key at POS1, end it at POS2 (origin 1)
Wenn du dem Nutzer unterschiedliche Sortiermöglichkeiten bieten willst, wäre wahrscheinlich eine Sortierung direkt in PHP sinnvoller, weil man die Daten nicht erneut holen müsste.

MfG Dalai
 
Das ganze wird per Browser gesteuert. Wenn der User die Sortierung ändern könnte wäre zwar schön aber wenn es zuviel Aufwand macht, gings auch erstmal ohne.

Wie das mit Pipe geht habe ich keine Ahnung.
Und beim php command gibts solche switches afaik nicht.

Das Problem ist glaube ich das bei dem Array die "Beschriftungen" für Zeilen oder Spalten fehlen.
.
EDIT :
.

Hier das Array von einer ähnlichen Ausgabe:
http://pastebin.com/Mie9LsTU

Also man muss das erstmal separarieren bevor man sortiert.

Ich denke mal ich muss die Variablen $cid2 und $cid3 nehmen und in ein Multi Array stecken, nur wie?
 
Weiß das echt niemand?

Man kann ja mit array($cid2,$cid3); ein neues array erzeugen. Und bei der nächsten While Schleife dann array_merge hmmmmm
 
Ich verstehe das Problem im Moment nicht so ganz. Warum nutzt Du nicht zum Beispiel eine der Array-Sortierfunktionen?
 
Weil in dem ursprünglichen Array Telefonnr und Name in einem Datensatz steckt
http://pastebin.com/Mie9LsTU

Mit den Zeilen stecke ich das jeweils in eine Variable die ich ausgegeben habe aber bisher nicht sortierbar waren:
$cid2 = preg_replace($search2,"",$cid[$i]);
$cid3 = preg_replace($search3,"",$cid[$i]);
 
Naja, ich würde dann vielleicht zweistufig da heran gehen. Zuerst die Ausgabe in einer Schleife in einen tabellenartigen Array parsen, und dann hinterher einfach den entsprechenden Sort drüber laufen lassen.

Oder sonst einfach als CSS/Javascript sortierbare Tabelle ausgeben?

Edit: Oder eben einen usort mit benutzerdefinierter Vergleichsfunktion.
 
die Ausgabe in einer Schleife in einen tabellenartigen Array parsen

genau daran scheitere ich ja schon

ich hatte es so in der Art in der While Schleife:

$cidnew2 = $cidnew; <- um den Wert aus der vorherigen while schleife nicht zu verlieren
$cidnew = array($cid2,$cid3); <- beide variablen in array speichern
$cidnew = array_merge($cidnew,$cidnew2); <- neues array und vorheriges array zusammenfügen
 
Zuletzt bearbeitet:
Sollte das nicht auch in etwa einfach so funktionieren (nicht getestet):

PHP:
$search2 = "/[^0-9]/";
$search3 = "/[0-9]/";

$cid_neu = array();

foreach($cid as $key => $value)
{
  $cid_neu[$key]['nummer'] = preg_replace($search2, "", $value);
  $cid_neu[$key]['name'] = preg_replace($search3, "", $value);
}

usort($cid_neu, "cmp_name");

function cmp_name($a, $b)
{
    return strcmp($a['name'], $b['name']);
}

?
 
Zuletzt bearbeitet:
Hm ja, keine Ahnung - eigentlich müsste das irgendwie so funktionieren. Ich werde aber leider heute wohl nicht dazu kommen, das selbst mal auszuprobieren (keinen Zugriff auf eine PHP-Umgebung im Moment).
 
Das in Beispiel3 klappt auch nicht
http://php.net/manual/de/function.array-multisort.php

Da wird dann einfach nur die komplette Liste umgedreht wenn man z.B. name nach DESC macht

Code:
<?php
$search = array("[0;37m","[0m","/cidname/",":");
$search2 = "/[^0-9]/";
$search3 = "/[0-9]/";
set_time_limit(5);

unset($cid);
exec("/usr/sbin/asterisk -rx 'database show cidname'", $cid);
$cid = str_replace($search,"",$cid);

# create new array cid_new and put cid values into 
$cid_new = array();
foreach($cid as $key => $value)
{
$cid_new[$key]['number'] = preg_replace($search2, "", $value);
$cid_new[$key]['name'] = preg_replace($search3, "", $value);
}

#usort($cid_new, "cmp_name");
#function cmp_name ($a, $b)
#{
#return strcmp($a['name'], $b['name']);
#}

#sort multi array
foreach ($cid_new as $key => $row) {
$snumber[$key] = $row['number'];
$sname[$key] = $row['name'];
}
array_multisort($sname, SORT_DESC, $snumber, SORT_DESC, $cid_new);

#output array
foreach($cid_new as $key => $value) {
print $cid_new[$key]['name']."&nbsp;";
print $cid_new[$key]['number']."<br />";
}

?>
 
Zuletzt bearbeitet:
Also die Strings hatten alle ein Leerzeichen. Also statt "Name" stand " Name". Als ich die Leerzeichen entfernt habe, hat es korrekt sortiert.

Der Grund war, es war nicht nur ein Leerzeichen davor (sondern verschieden viele) und der Dump hat dies nicht angezeigt, der zeigt nur ein Leerzeichen. Und die Anzahl der Leerzeichen war auch verschieden zwischen den Zeilen, deswegen hatte es so seltsam sortiert.
 
Zuletzt bearbeitet:
Ahh super - freut mich, dass es doch noch geht.

Ein kleiner Änderungsvorschlag:

PHP:
#output array
foreach($cid_new as $row) {
  print $row['name']."&nbsp;";
  print $row['number']."<br />";
}

$row enthält ja schon eine vollständige Zeile des Array, und einen Schlüssel brauchst Du nicht.
 
Wäre es wohl schwer wenn man eine Liste von Anrufern mit Telefonnummern hat die aus einem CSV generiert wurden und man möchte dann automatisch einen Lookup machen, wem die Telefonnummer gehört? Das heisst es soll dann nicht nur die Nummer angezeigt werden, sondern auch der Name.

Für die Anrufe habe ich einen Code in Perl der das ganze in ein Array steckt:
web.archive.org/web/20061013071611/www.3ait.co.uk/~jon/cdr-info.pls
Die Nummern stecken alle in $cdrentry[1]

Der Code von oben ist ja nur das Telefonbuch alleine.

Edit: Schon fertig, ist ja einfacher als ich dachte
 
Zuletzt bearbeitet:
Zurück
Oben Unten