2010-04-23 2 views
0

Je crée un tableau avec un ensemble de champs de base de données avec des informations sur la table, le nom de champ réel et le nom de champ descriptif sous la forme d'un tableau multidimensionnel. Voici ce qu'il ressemble actuellement:Tri de valeur de tableau multidimensionnel en PHP

$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"; 

D'accord, cela est bien beau, mais je TUYAUTERIE cela dans un système qui permet l'exportation des champs sélectionnés, et à la fin je veux foreach() à travers les différents niveaux , extraire les données et finalement avoir tous les champs descriptifs à afficher triés alphabétiquement en utilisant leur nom descriptif. Donc, en fin de compte dans l'ordre: Emplacement actuel, code de lieu actuel, article préféré commandé, prénom puis ID utilisateur - évidemment conserver les associations d'index.

Je ne peux pas utiliser usort() et je ne peux pas utiliser array_multisort() ... ou peut-être que je peux et je ne sais pas comment. usort() semble avoir besoin d'une clé pour trier, mais j'ai des touches variables. array_multisort() semble juste faire comme tri() vraiment.

+0

Où stockez-vous les valeurs dans cette structure? –

+0

Les valeurs sont les éléments entre guillemets ... J'associe fondamentalement une description avec un champ particulier dans une table particulière. – David

+0

Je suis désolé, je suis confus par les noms de champs et les valeurs, pouvez-vous poster un exemple de votre sortie finale attendue? –

Répondre

0

Ceci est uniquement pour un tableau 2D. Pas la pièce la plus élégante de code que je l'ai écrit, mais ça fonctionne ...

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

Hmm Manos, j'ai essayé votre suggestion, voir mon post imminent :) – David

0

Permettez-moi de donner plutôt des données réelles par exemple, par opposition aux données fausses parce que les fausses données me presque confus. Ainsi, de fausses données sont commentées.

/* 
$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); 

Je vais avoir l'un des « les » vendredi ... print_r ($ champs) révèle que les touches sont triées et les valeurs sont associées, mais il est encore le tri par les touches et non la valeur finale.

Il est presque comme si je besoin d'un système de tri inverse qui vérifie toutes les valeurs d'abord, les trie et dit « d'accord où vous appartenez ... ah vous appartenez à FieldX dans le tableau Y »

J'espérais y C'était une façon sournoise et astucieuse de le faire, peut-être y en a-t-il, mais je suppose que je vais écrire une fonction pour analyser les données, écrire un tableau inversé et réécrire l'original en ordre de valeur. Hectically inefficace, mais ça va faire.

Toujours ouvert à de meilleures suggestions si!

0

D'accord, ce n'est pas élégant du tout. Donc, je n'encourage pas à l'utiliser et je chercherai un meilleur moyen de progresser. Mais voici la solution que j'ai qui fonctionne avec les exemples ci-dessus et ci-dessous.

Malheureusement, comme je le souhaite, le tableau DOIT contenir un numéro de 'commande' précédent, donc je suppose que c'est un échec de ma part depuis le début. Mais ça marche maintenant.

$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

J'ai eu littéralement de nous en sortir hier pour un projet que je travaillais - voici mon code:

tableau des ressources ressemble à ceci:

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

Quelques fonctions de tri à trier par titre ASC ou 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']); 
} 

et enfin utiliser usort pour faire le sale avant Loo p à travers $ resource et output quoi que ce soit dont vous avez besoin.

usort($resource, "compare_asc"); 
Questions connexes