Сортировка значений многомерного массива в PHP - PullRequest
0 голосов
/ 23 апреля 2010

Я создаю массив с набором полей базы данных с информацией о таблице, фактическом имени поля и описательном имени поля в виде многомерного массива. Вот как это выглядит в настоящее время:

$Fields['User']['ID'] = "User ID";
$Fields['User']['FirstName'] = "First Name";
$Fields['Stats']['FavouriteOrder'] = "Favourite Item Ordered";
$Fields['Geographic']['Location'] = "Current Location";
$Fields['Geographic']['LocationCode'] = "Current Location Code";

Хорошо, это нормально, но я передаю это в систему, которая позволяет экспортировать выбранные поля, и в конце я хочу выполнить foreach () через различные уровни, извлечь данные и затем в конечном итоге получить все описательные поля. сортируется в алфавитном порядке с использованием их описательного имени. Таким образом, в конечном итоге в следующем порядке: Текущее местоположение, Код текущего местоположения, Упорядоченный элемент избранного, Имя, затем идентификатор пользователя - очевидно, сохраняя связи индекса.

Я не могу использовать usort () и я не могу использовать array_multisort () ... или, может быть, я могу, и я просто не знаю как. usort (), похоже, нужен ключ для сортировки, но у меня есть переменные ключи. array_multisort (), похоже, действительно делает то же самое, что и sort ().

Ответы [ 4 ]

0 голосов
/ 23 апреля 2010

Мне буквально пришлось вчера разработать это для проекта, над которым я работал - вот мой код:

Массив ресурсов выглядит так:

$resource[$count]['title']
$resource[$count]['filepath']
$resource[$count]['filename']
$resource[$count]['taxonomy'][0]

Пара функций сортировки по названию ASC или DESC

function compare_asc($a, $b) {
    return strcmp($a['title'], $b['title']);
}
function compare_desc($a, $b) {
    if ($a['title'] == $b['title']) {
        return 0;
    }
    return ($a['title'] > $b['title']) ? -1 : 1;
    //return strcmp($a['title'], $b['title']);
}

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

usort($resource, "compare_asc");
0 голосов
/ 23 апреля 2010

Позвольте мне привести пример реальных данных, в отличие от поддельных данных, потому что поддельные данные почти смутили меня.Итак, фальшивые данные прокомментированы.

/*
$Fields['User']['ID'] = "User ID";
$Fields['User']['FirstName'] = "First Name";
$Fields['Stats']['FavouriteOrder'] = "Favourite Item Ordered";
$Fields['Geographic']['Location'] = "Current Location";
$Fields['Geographic']['LocationCode'] = "Current Location Code";
*/

$Fields['Product']['ReferenceNumber'] = "Product Reference Number";
$Fields['Product']['Halaal'] = "Halaal Status";
$Fields['Product']['Kosher'] = "Kosher Status";
$Fields['Product']['KosherType'] = "Kosher Type";
$Fields['Product']['CuringSalts'] = "Curing Salts Status";
$Fields['Product']['ProductVisibility'] = "Product Visibility";
$Fields['Product']['ProductStatus'] = "Product Status";
$Fields['Product']['PackBarCode'] = "Barcode";
$Fields['Product']['ProductDescription'] = "Product Description";
$Fields['Pack']['PackSize'] = "Pack Size";
$Fields['Pack']['PackSizeNumeric'] = "Numeric Pack Size";
$Fields['Allergens']['ContainsNuts'] = "Product Contains Nuts";


foreach ($Fields as $key => $value) {
    ksort($value);
    $Fields[$key] = $value;
}
ksort($Fields);

У меня один из "тех" пятниц ... print_r ($ Fields) показывает, что ключи сортируются и значения связаны, но это все еще сортировкапо ключам, а не по конечному значению.

Это почти как мне нужна система обратной сортировки, которая сначала проверяет все значения, сортирует их, а затем говорит: «Хорошо, где вы принадлежите ... ах, вы принадлежите FieldX вТаблица Y '

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

Тем не менее, мы все еще открыты для лучших предложений!

0 голосов
/ 23 апреля 2010

Хорошо, это совсем не элегантно. Поэтому я не поощряю использование этого и буду искать лучший путь вниз по линии. Но вот решение, которое у меня есть, которое работает с примерами выше и ниже.

К сожалению, так, как я хочу, чтобы массив содержал предыдущий «упорядоченный» номер, поэтому, я полагаю, это сбой с моей стороны с самого начала. Но теперь это работает.

$TempDescArray = array();
$TempFieldArray = array();
$TempTableArray = array();
$Pointer = 0;

foreach ($Fields as $Table => $FieldsArray) {   
    foreach ($FieldsArray as $Field => $Description) {
        $TempDescArray[$Pointer] = $Description;
        $TempFieldArray[$Pointer] = $Field;
        $TempTableArray[$Pointer] = $Table;
        $Pointer++;
    }
}

asort($TempDescArray);
$Fields = array();
$Pointer2 = 0;

foreach ($TempDescArray as $Pointer => $Description) {
    $Fields[$Pointer2][$TempTableArray[$Pointer]][$TempFieldArray[$Pointer]] = $Description;
    $Pointer2++;
}
0 голосов
/ 23 апреля 2010

Это только для двумерного массива. Не самый элегантный кусок кода, который я написал, но он работает ...

    foreach($Fields as $key=>$var) {
        ksort($var);
        $Fields[$key]=$var;
    }
    ksort($Fields);
...