note 26281 added to function.usort

From: Date: Thu, 24 Oct 2002 21:37:56 +0000
Subject: note 26281 added to function.usort
Groups: php.notes 
Request: Send a blank email to php-notes+get-38521@lists.php.net to get a copy of this message
If you've used ADO before, you may have used the Sort property on a recordset. It's very powerful - you can add a nice ORDER BY clause after getting the recordset from the database. It's especially helpful if you want to show a list on a web page and make the column headings links that cause the list to resort on that column. I wanted to do the same thing with mysql recordsets, but it looks like you have to have the ORDER BY in your query. I re-worked the example from johan_land at yahoo dot com above for sorting multidimensional arrays. When I get a mysql recordset, I create an array with all of the records like this: $aaRows[] = array(); if (mysql_num_rows($rsRows) > 0) while ($aRow = mysql_fetch_array($rsRows, MYSQL_ASSOC)) $aaRows[] = $aRow; At this point $aaRows is an array of arrays - it's a numeric-indexed array containing records from the recordset, which themselves are associative arrays. The following code takes the array of records as the first parameter, and an array of fields to sort - each field is an associative array, where 'name' is the db field name, and 'dir' is the direction to sort. If dir is 'DESC' (case-insensitive), it will sort descending. Any other value (including not setting one) will cause it to sort ascending. function sortRows(&$a_aaRows, $a_aaSortCriteria) { GLOBAL $g_aaSortArray; function compare($a_aRow1, $a_aRow2, $a_lField = 0) { GLOBAL $g_aaSortArray; $lCompareVal = 0; if ($a_lField < count($g_aaSortArray)) { $sSortFieldName = $g_aaSortArray[$a_lField]['name']; $sSortFieldDir = $g_aaSortArray[$a_lField]['dir']; $vValue1 = eval('return $a_aRow1[' . $sSortFieldName . '];'); $vValue2 = eval('return $a_aRow2[' . $sSortFieldName . '];'); if ($vValue1 == $vValue2) $lCompareVal = compare($a_aRow1, $a_aRow2, $a_lField + 1); else { $lCompareVal = $vValue1 > $vValue2 ? 1 : -1; if (strtolower(substr($sSortFieldDir, 0, 4)) == 'desc') $lCompareVal = -$lCompareVal; } } return $lCompareVal; } $g_aaSortArray = $a_aaSortCriteria; usort($a_aaRows, 'compare'); } When I call it it looks something like this: sortRows($aaRows, array(array('name' => 'STATE', 'dir' => 'ASC'), array('name' => 'CITY', 'dir' => 'DESC'))); -- http://www.php.net/manual/en/function.usort.php http://master.php.net/manage/user-notes.php?action=edit+26281 http://master.php.net/manage/user-notes.php?action=delete+26281 http://master.php.net/manage/user-notes.php?action=reject+26281

« previous php.notes (#38521) next »