2012-02-08 3 views
0

J'ai une question. Je construis un tableau en obtenant des données de mysql et en fusionnant trois résultats de requête dans un tableau.Trier les tableaux par date

Je mis les données à un tableau comme celui-ci:

while ($a = mysql_fetch_object($activities)) { 
      $a->type = 1; 
      $array1[] = $a; 
     } 
     while ($k = mysql_fetch_object($fuups)) { 
     $k->type = 2; 
      $array1[] = $k; 
     } 
     while ($x = mysql_fetch_object($refuups)) { 
      $x->type = 3; 
      $array1[] = $x; 
     } 

     return (object)$array1; 

Ce retourne quelque chose comme ceci:

stdClass Object 
(
    [0] => stdClass Object 
     (
      [added] => 2012-01-17 07:33:53 
      [type] => 1 
     ) 

    [1] => stdClass Object 
     (
      [added] => 2012-01-13 06:36:22 
      [type] => 1 
     ) 

    [2] => stdClass Object 
     (
      [added_type_2] => 2012-01-09 04:01:12 
      [type] => 2 
     ) 

    [3] => stdClass Object 
     (
      [added_type_2] => 2012-02-08 02:08:32 
      [type] => 2 
     ) 

    [4] => stdClass Object 
     (
      [added_type_2] => 2012-01-25 00:09:08 
      [type] => 2 
     ) 

    [5] => stdClass Object 
     (
      [added_type_3] => 2012-01-23 00:09:08 
      [type] => 3 
     ) 

    [6] => stdClass Object 
     (
      [added_type_3] => 2012-01-22 00:09:08 
      [type] => 3 
     ) 

) 

J'ai essayé des choses comme asort, ksort, sorte, mais pas de chance. Vous obtenez également les dates avec "ordre par desc descendant" merci

+0

juste une pensée peut vous appeler ces trois requêtes et créer une union et obtenir un résultat .. facile à trier en sql ..? – AJP

+0

J'ai également essayé mais je ne peux pas comprendre comment php sait quel est le type de contenu que cette requête obtient –

+0

Pas si sûr de ce genre de tri, mais pouvez-vous le trier en utilisant la requête et l'extraire de la base de données dans un ordre souhaitable ? – Wh1T3h4Ck5

Répondre

0

Vous pouvez utiliser usort() si vous changez chercher objet à chercher assoc:

function my_date_sort($a,$b) { 
    if(isset($a[0]) && isset($b[0])) { 
     $a = strtotime($a[0]); // optionally convert to time 
     $b = strtotime($b[0]); 
     if($a == $b) return 0; 
     else return ($a > $b) ? 1 : -1; 
    } else { // no valid subs, change this to put empty ones on top or bottom 
     return 1; // put at bottom, -1 would put at top. 
} 


usort($results, 'my_date_sort'); 

Bonne chance ...

+0

+1 FYI, les comparaisons de chaînes droites fonctionneraient dans son cas particulier, en supprimant le besoin de strtotime: 'if ('2012-01-17 07:33:53'> '2012-01-13 06:36 : 22 ') 'fonctionnerait vraiment bien. – webbiedave

2

Ce que vous essayez de faire est de trier un tableau multidimensionnel, vous pouvez trouver beaucoup sur Google à ce sujet. Une solution élégante belle serait quelque chose comme:

// Sort the multidimensional array 
usort($results, "custom_sort"); 

// Define the custom sort function 
function custom_sort($a,$b) { 
    return $a['some_sub_var']>$b['some_sub_var']; 
} 

EDIT 1:

Pour ceux dans les commentaires doutant de ce code fonctionnerait, s'il vous plaît ne hésitez pas à essayer (j'ai même ajouté dans un date à laquelle est une copie à des fins de test):

function custom_sort($a,$b) { 
     return $a['added']>$b['added']; 
} 

$arrayToSort = array(
        array(
         "added" => "2012-01-17 07:33:53", 
         "type" => "1" 
        ), 
        array(
         "added" => "2012-01-13 06:36:22", 
         "type" => "1" 
        ), 
        array(
         "added" => "2012-01-09 04:01:12", 
         "type" => "2" 
        ), 
        array(
         "added" => "2012-02-08 02:08:32", 
         "type" => "2" 
        ), 
        array(
         "added" => "2012-01-25 00:09:08", 
         "type" => "2" 
        ), 
        array(
         "added" => "2012-01-13 06:36:22", 
         "type" => "1" 
        ), 
        array(
         "added" => "2012-01-13 06:36:22", 
         "type" => "1" 
        ), 
        array(
         "added" => "2012-01-23 00:09:08", 
         "type" => "3" 
        ), 
        array(
         "added" => "2012-01-22 00:09:08", 
         "type" => "3" 
        ) 
       ); 
usort($arrayToSort, "custom_sort"); 

echo '<pre>'; 
print_r($arrayToSort); 
echo '</pre>'; 

un bon endroit pour tester serait rapidement d'aller à http://writecodeonline.com/php/.

+1

au moins le copier correctement: 'return ($ a <$ b)? -1: 1; '.) – Vyktor

+1

@Garry Welding: Si' $ a' est inférieur à '$ b', votre code retournera' 0' (en fait 'null') plutôt que' -1'. "0" est supposé être renvoyé s'il est égal. Vous devez lire la documentation. – webbiedave

+0

J'encourage les deux commentateurs ci-dessus à essayer le code. –

0

Vous devriez probablement utiliser UNION lors de la sélection et ne pas essayer de trier les baies par vous-même. Quoi qu'il en soit si vous devez utiliser peut usort comme ceci:

function cmp($a, $b){ 
    if(!($a instanceOf stdClass) && !($b instanceOf stdClass)){ 
    return 0; 
    } 

    // Check object 
    if( !($a instanceOf stdClass)){ 
    return -1; 
    } 
    if( !($b instanceOf stdClass)){ 
    return 1; 
    } 

    $aVal = NULL; 
    if(isset($a->added)){ 
    $aVal = $a->added; 
    } elseif(isset($a->added_type_2)){ 
    $aVal = $a->added_type_2; 
    } ... 

    // The same for b 
    if(($aVal == NULL) && ($bVal == NULL)){ 
    return 0; 
    } 

    if($aVal == NULL){ 
    return -1; 
    } 

    if($bVal == NULL){ 
    return 1; 
    } 

    if($aVal == $bVal){ 
    return 0; 
    } 

    return ($aVal > $bVal) ? 1 : -1; 

} 

usort($array, 'cmp'); 

Comme vous pouvez voir l'état comment comparer objet peut devenir complexe quand faire en sorte qu'ils ont des types corrects et les valeurs correctes. Lorsque vous sélectionnez des colonnes mysql, vous devez utiliser au moins SELECT added_type_2 AS added pour que les noms de colonne soient plus compacts et les conditions plus simples.