2009-03-30 3 views
2

У меня есть большая таблица данных, вытащенная из моей базы данных (~ 1500 строк, каждая с 10-15 полями), и я делаю несколько фильтров и генерирую некоторую статистику и сохраняя их в электронной таблице Excel для загрузки пользователем ,Использование array_multisort в том же массиве несколько раз?

Вместо того, чтобы сбрасывать базу данных с помощью такого же сложного запроса снова и снова с незначительными изменениями (для WHERE и ORDER BY), я делаю одну поездку в БД, помещая результаты в один большой массив и затем используя array_filter и array_multisort, чтобы получить мои новые представления данных.

Я новичок в array_multisort, поэтому опубликую то, что я сделал здесь для критики.

// an numerical array of associative arrays 
$records = $dbResult->convertToArray(); 

$fields = $dbResult->getFieldNames(); 

// this is run once at the start 
$sortArr = array(); 
foreach ($fields as $field) $sortArr[$field] = array(); 

foreach ($records as $r) { 
    foreach ($r as $key => $value) { 
     $sortArr[$key][] = $value; 
    } 
} 

// and then to sort: 
array_multisort(
    $sortArr['Date Completed'], SORT_DESC, 
    $sortArr['Last Name'], SORT_ASC, 
    $sortArr['First Name'], SORT_ASC, 
    $sortArr['Course'], SORT_ASC, 
    $records 
); 

Это прекрасно работает, хотя первоначальная «копия всего результата в другой массив» кажется мне странной. Проблема возникает, когда мне нужно снова отсортировать список. У меня такое ощущение, что мой $sortArr должен оставаться в синхронизации с массивом $records, но он разбивается после каждого вида.

Я даже не уверен, что это предполагаемое использование array_multisort, так что я могу быть в стороне от трека здесь. Может ли кто-нибудь дать совет или советы? Как сделать вы сортировать многомерные массивы?

ответ

1

Вот что я в итоге пошел. Это слегка измененная версия функции, опубликованной martin в комментариях на странице usort в руководстве по PHP.

function arfsort(&$array, $fieldList){ 
    if (!is_array($fieldList)) { 
     $fieldList = array(array($fieldList, SORT_ASC)); 
    } else { 
     for ($i = 0; $i < count($fieldList); ++$i) { 
      if (is_array($fieldList[$i])) { 
       if (!isset($fieldList[$i][1])) $fieldList[$i][1] = SORT_ASC; 
      } else { 
       $fieldList[$i] = array($fieldList[$i], SORT_ASC); 
      } 
     } 
    } 
    $GLOBALS['__ARFSORT_LIST__'] = $fieldList; 
    usort($array, 'arfsort_func'); 

} 

function arfsort_func($a, $b){ 
    foreach($GLOBALS['__ARFSORT_LIST__'] as $f) { 
     $strc = strcasecmp($b[$f[0]], $a[$f[0]]); 
     if ($strc != 0){ 
      return $strc * (!empty($f[1]) && $f[1] == SORT_DESC ? 1 : -1); 
     } 
    } 
    return 0; 
} 

Я надеюсь, что функция была немного более надежной, чем оригинальное решение. Использование:

arfsort($my2DArray, "id"); // just sort by the id field, ascending 
// sort by these lastName then firstName, ascending 
arfsort($my2DArray, array("lastName", "firstName")); 

arfsort($my2DArray, array(
    array("date", SORT_DESC), // sort by date DESC 
    array("lastName", SORT_ASC), // then by last name ascending 
    array("firstName"),   // SORT_ASC is the default 
    "middleInitial"    // and you don't need to wrap stuff in an array. 
)); 
Смежные вопросы