User Tools

Site Tools


php:sortetlist

[PHP] Per klick sortierbare List

Es geht darum, dass man am Schluss eine Tabelle mit Daten hat. Die Überschriften sind anklickbar. Wenn man auf einen Titel klickt, dann wird die Tabelle nach dieser Spalte sortiert. Klickt man auf denselben Titel, wird die Sortierung umgedreht. Klickt man auf einen anderen Titel, dann wird die Tabelle absteigend nach der neuen Spalte sortiert.

In Meinem Beispiel arbeite ich ohne DB. Die Daten sind in einem Array
Das ist zum Spielen einfacher *g*. Für die Sortierung verwende ich die Funktion array_sort_by_subarray_item(): [PHP] array_sort_by_subarray_item(). Wenn die Daten aus einer DB kommen, wird diese Funktion nicht benötigt. Dann kann man die Sortierung direkt im SQL vornehmen.

//Standarts defineren
define('C_DEFAULT_ORDER_BY', 'vorname');
define('C_DEFAULT_DIRECTION', SORT_ASC);
 
//Spalten definieren
$columns['vorname'] = array('direction' => C_DEFAULT_DIRECTION, 'title' => 'Vorname');
$columns['ort']     = array('direction' => C_DEFAULT_DIRECTION, 'title' => 'Ort');
 
//Die Eingaben auswerten und ggf. Standarts setzen
$orderBy = isset($_GET['orderBy']) ? $_GET['orderBy'] : C_DEFAULT_ORDER_BY;
if(!array_key_exists($orderBy, $columns)) $orderBy = C_DEFAULT_ORDER_BY; 
$direction = (int) (isset($_GET['direction']) ? $_GET['direction'] : C_DEFAULT_DIRECTION);
 
/**
 *  --- Dieser Teil kann auch aus der DB gemacht werden. Inkl. des Sortings
 *  $sqlDirection = ($direction == SORT_DESC) ? 'DESC' : '';
 *  $sql = "SELECT vorname, nachname FROM myTable ORDER BY {$orderBy} {$sqlDirection};";
 *  $result = mysql_query($sql);
 *  $data = array()
 *  foreach($row = mysql_fetch_assoc($result)) $data[] = $row;
 */
 
// --- Ich simuliere hier die DB-Daten
	//Daten
	$data[] = array('vorname' => 'Hans',    'ort' => 'Zürich');
	$data[] = array('vorname' => 'Peter',   'ort' => 'Bern');
	$data[] = array('vorname' => 'Thomas',  'ort' => 'Basel');
	$data[] = array('vorname' => 'Stefan',  'ort' => 'Genf');
	//Daten sortieren --- array_sort_by_subarray_item(): http://wiki.yaslaw.info/wikka/PhpArraySortBySubarrayItem
	array_sort_by_subarray_item($data, $orderBy, $direction);
// -- Ende DB-Simulations-Teil
 
//Die Direction für den Link auf aktuelle Spalte anpassen.
if(($direction == SORT_ASC)) $columns[$orderBy]['direction'] = SORT_DESC;  
 
//Tabelle ausgeben
echo "<table>\n";
echo "  <tr>\n";
//Titelzeilen
foreach($columns as $key => $col){
	echo "    <th><a href = '?orderBy={$key}&direction={$col['direction']}'>{$col['title']}</a></th>\n";
}
echo "  </tr>\n";
//Datenzeilen
foreach($data as $item){
	echo "  <tr>\n";
	//Datenfleder
	foreach(array_keys($columns) as $colName){
		echo "    <td>{$item[$colName]}</td>\n";
	}
	echo "  </tr>\n";
}
echo '</table>';
<table>
  <tr>
	<th><a href = '?orderBy=vorname&direction=3'>Vorname</a></th>
	<th><a href = '?orderBy=ort&direction=4'>Ort</a></th>
  </tr>
  <tr>
	<td>Hans</td>
	<td>Zürich</td>
 
  </tr>
  <tr>
	<td>Peter</td>
	<td>Bern</td>
  </tr>
  <tr>
	<td>Stefan</td>
	<td>Genf</td>
  </tr>
  <tr>
	<td>Thomas</td>
	<td>Basel</td>
  </tr>
</table>
php/sortetlist.txt · Last modified: 11.12.2013 16:18:26 (external edit)