2012-10-05 4 views
0

Fondamentalement, je suis en train de trier un tableau complexe d'objets dans un tableau:Trie un tableau d'objets dans tableau par valeur

Array 
(
    [190515] => stdClass Object 
     (
      [nid] => 15740686 
      [venue_nid] => 190515 
      [occurrences] => 1 
      [this_weeks_occurrences] => 0 
      [end_date] => 1350853200 
      [end_date_end_time] => 1350853200 
      [is_ongoing] => 0 
      [title] => Wentz Concert Hall and Fine Arts Center 
      [times] => Array 
       (
        [0] => stdClass Object 
         (
          [nid] => 15740686 
          [venue_nid] => 190515 
          [venue_title] => Wentz Concert Hall and Fine Arts Center 
          [datepart] => 20121021 
          [occurrences] => 1 
          [times] => Sun 4:00pm 
          [end_times] => Sun 4:00pm 
          [next_year] => 0 
          [next_month] => 0 
          [next_week] => 3 
          [occurrence_date] => 1350853200 
         ) 

       ) 

      [times_list] => Array 
       (
        [0] => Oct 21 sun 4:00pm 
       ) 

     ) 

    [31403] => stdClass Object 
     (
      [nid] => 15740686 
      [venue_nid] => 31403 
      [occurrences] => 1 
      [this_weeks_occurrences] => 0 
      [end_date] => 1350176400 
      [end_date_end_time] => 1350176400 
      [is_ongoing] => 0 
      [title] => KAM Isaiah Israel 
      [times] => Array 
       (
        [0] => stdClass Object 
         (
          [nid] => 15740686 
          [venue_nid] => 31403 
          [venue_title] => KAM Isaiah Israel 
          [datepart] => 20121014 
          [occurrences] => 1 
          [times] => Sat 8:00pm 
          [end_times] => Sat 8:00pm 
          [next_year] => 0 
          [next_month] => 0 
          [next_week] => 2 
          [occurrence_date] => 1350176400 
         ) 

       ) 

      [times_list] => Array 
       (
        [0] => Oct 13 sat 8:00pm 
       ) 

     ) 

    [33861] => stdClass Object 
     (
      [nid] => 15740686 
      [venue_nid] => 33861 
      [occurrences] => 1 
      [this_weeks_occurrences] => 0 
      [end_date] => 1350781200 
      [end_date_end_time] => 1350781200 
      [is_ongoing] => 0 
      [title] => Music Institute of Chicago, Nichols Concert Hall 
      [times] => Array 
       (
        [0] => stdClass Object 
         (
          [nid] => 15740686 
          [venue_nid] => 33861 
          [venue_title] => Music Institute of Chicago, Nichols Concert Hall 
          [datepart] => 20121021 
          [occurrences] => 1 
          [times] => Sat 8:00pm 
          [end_times] => Sat 8:00pm 
          [next_year] => 0 
          [next_month] => 0 
          [next_week] => 3 
          [occurrence_date] => 1350781200 
         ) 

       ) 

      [times_list] => Array 
       (
        [0] => Oct 20 sat 8:00pm 
       ) 

     ) 

) 

J'ai besoin de trier par occurrence_date et veiller à ce que les données contenues dans la partie supérieure objet (eg190515) ne sont pas endommagés avec d'autres objets et pour inclure la possibilité qu'il pourrait y avoir un second occurrence_date pour les "times" [tableau] d'objets.

J'ai vu des tableaux de tri d'objets similaires par champ ici, mais pas avec la profondeur du tableau/objet. J'ai essayé d'utiliser usort mais je ne pense pas que ma syntaxe à la valeur soit correcte.

Fondamentalement ce que j'ai essayé.

function cmp($x, $y) { 
    if ($x->occurrence_date > $y->occurrence_date) { 
     return 1; } 
    else { 
     return -1; } 
} 
usort($node->timeout_events_schedule->venues, 'cmp'); 

Merci à l'avance

+0

Pouvez-vous nous montrer votre code? – doktorgradus

+0

Mis à jour avec le codage. – homersheineken

+0

Pourquoi compareriez-vous les nombres avec strcmp? – Bugs

Répondre

3

Que diriez-vous:

function compare($x,$y) 
{ 
    if($x->times[0]->occurrence_date == $y->times[0]->occurrence_date) 
     return 0; 
    elseif($x->times[0]->occurrence_date < $y->times[0]->occurrence_date) 
     return -1; 
    else 
     return 1; 

} 

uasort($your_array,'compare'); 

uasort() préserver vos clés, contrairement à usort() http://www.php.net/manual/en/function.uasort.php

+0

Eh bien, après avoir restauré et changé complètement votre réponse après 25 minutes, on devrait s'attendre à ce qu'il soit correct, mais le code présenté ne fonctionnera pas avec les données d'échantillon fournies par OP. C'est pourquoi il est préférable de guider quelqu'un en écrivant son propre code qu'il comprendra comment cela fonctionne, de sorte qu'il peut être personnalisé sans plus d'aide. –

+0

mon mauvais D: Je vais le faire comme ça la prochaine fois – Eagle

+0

J'ai essayé ça et ça n'a pas trié. Également essayé la suggestion @ dev-null-dweller d'utiliser la var comme: $ x-> fois [0] -> occurence_date et qui a tué php. – homersheineken

2

quelques conseils pour vous aider à résoudre votre problème:

  • vous aurez besoin uasort fonction, pour préserver les clés associatives
  • Vous ne pouvez pas accéder à la clé occurrence_date directement à partir $x ou $y, vous aurez besoin $x->times[0]->occurence_date
  • Avant de faire la comparaison, itérer $x->times juste pour vérifier s'il y a plus d'entrées, choisissez celui qui convient à vos besoins.
  • depuis occurence_date est un numéro que vous ne devez pas utiliser la fonction de comparaison de chaînes

Bonne chance :)

Questions connexes