2012-04-05 15 views
5

द्वारा PHP में किसी सरणी के भीतर सरणी को सरणी करना वर्तमान में मुझे PHP के भीतर एक समस्या है जहां मैं इन पदों को उनकी निर्माण तिथि से सॉर्ट करना चाहता हूं ताकि उन्हें अवरोही क्रम में दिखाया जा सके। मैं ऐसा करने के लिए एक PHP फंक्शन की तलाश में हूं लेकिन कोई भाग्य नहीं है।डेटाटाइम

क्या इसका कोई आसान समाधान है? किसी भी विचार बहुत सराहना की जाएगी :)

array 
     0 => 
     array 
      'post_id' => string '1' (length=1) 
      'user_id' => string '3' (length=1) 
      'post' => string 'this is a post' (length=14) 
      'created' => string '2012-04-05 20:11:38' (length=19) 
    1 => 
     array 
      'post_id' => string '2' (length=1) 
      'user_id' => string '2' (length=1) 
      'post' => string 'this is a post' (length=14) 
      'created' => string '2012-04-05 20:11:38' (length=19) 
    2 => 
     array 
      'post_id' => string '3' (length=1) 
      'user_id' => string '5' (length=1) 
      'post' => string 'this is a post' (length=14) 
      'created' => string '2012-04-05 20:11:38' (length=19) 
+4

यह एक से आ रही है डेटाबेस? यदि नहीं, तो क्यों नहीं? – NullUserException

+0

इस सरणी को कहां से लोड किया जा रहा है? – hjpotter92

+3

हां, संदिग्ध रूप से MySQL क्वेरी पंक्तियों की तरह दिखता है। 'डीईएससी द्वारा निर्मित आदेश' –

उत्तर

5

इस प्रयास करें:

<?php 
$a=array(
     0 => 
     array(
      'post_id' => '1', 
      'user_id' => '3', 
      'post' => 'this is a post', 
      'created' => '2012-04-05 20:11:40' 
     ), 
    1 => 
     array(
      'post_id' => '2', 
      'user_id' => '2', 
      'post' => 'this is a post', 
      'created' => '2012-04-05 20:11:39' 
     ), 
    2 => 
     array(
      'post_id' => '3', 
      'user_id' => '5', 
      'post' => 'this is a post', 
      'created' => '2012-04-05 20:11:38' 
     ) 
); 
function cmp($a,$b){ 
    return strtotime($a['created'])<strtotime($b['created'])?1:-1; 
}; 

uasort($a,'cmp'); 
print_r($a); 
?> 
+0

'cmp()' को ऋणात्मक मान वापस करना चाहिए यदि '$ a' को' $ b' से छोटा माना जाता है, तो '$ a'' b से अधिक है और 0 यदि वे बराबर हैं तो सकारात्मक मान। – Arjan

+1

धन्यवाद, उत्तर अपडेट किया गया (मैंने बराबर मामला छोड़ा, मुझे पता है ..) – stewe

+0

'स्ट्रेटोटाइम' की कोई आवश्यकता नहीं है। प्रारूप 'YYYY-MM-DD HH: MM: SS' (24 घंटे) को क्रमबद्ध करने के लिए केवल' strcmp' फ़ंक्शन की आवश्यकता है। – m13r

1

आप strtotime() उपयोग कर सकते हैं एक पूर्णांक के लिए टाइमस्टैम्प कन्वर्ट करने के लिए।

+2

में मान्य है और यह 2 डी सरणी को सॉर्ट करने में मदद करने के लिए कैसे जा रहा है? –

+0

हे ठीक है, अस्पष्ट सवाल। मैंने सोचा था कि ओपी का मतलब था कि उसकी टिकटें वाई-डी-एम थीं। –

+1

यदि तिथियां 'वाई-डी-एम 'प्रारूप में हैं, तो आप उन्हें आसानी से टाइमस्टैम्प में परिवर्तित नहीं कर सकते हैं। और यदि वे 'वाई-एम-डी' प्रारूप में हैं, तो आपको उन्हें बदलने की आवश्यकता नहीं है। – Arjan

1

तुम इतनी तरह एक कस्टम प्रकार समारोह का उपयोग कर एक सरणी सॉर्ट कर सकते हैं,:

function cmp($a, $b) { 
    if($a['created'] < $b['created']) { 
     return 1; 
    } else if ($a['created'] > $b['created']) { 
     return -1; 
    } else { 
     // The only option left is that they are equal 
     return 0; 
    } 
} 

usort($array, cmp); 

usort के बारे में अधिक जानकारी के लिए जाँच php manpage

+1

यह अवरोही के बजाय आरोही क्रम का उत्पादन करेगा। – MrCode

+1

मैंने अपना जवाब अपडेट किया। सौभाग्य से यह केवल एक छोटा सा परिवर्तन है। – Arjan

1

आप कर सकते हैं usort() फ़ंक्शन का उपयोग करें जो आपको अपने मानदंडों के आधार पर एक सरणी सॉर्ट करने की अनुमति देता है।

function cmp($a, $b) 
{ 
    if ($a['created'] == $b['created']) { 
     return 0; 
    } 

    return ($a['created'] < $b['created']) ? 1 : -1; 
} 

usort($myArray, "cmp"); 

print_r($myArray); 

या यदि आप एक समय में कनवर्ट करना चाहते हैं: आदेश द्वारा निर्दिष्ट mysql datetime क्षेत्र द्वारा और रिकॉर्ड/assoc_arrays की

function cmp($a, $b) 
{ 
    if ($a['created'] == $b['created']) { 
     return 0; 
    } 

    $aInt = strtotime($a['created']); 
    $bInt = strtotime($b['created']); 

    return ($aInt < $bInt) ? 1 : -1; 
} 
2

छंटाई सरणी:

function build_sorter($key, $dir='ASC') { 
     return function ($a, $b) use ($key, $dir) { 
      $t1=strtotime(is_array($a)?$a[$key]:$a->$key); 
      $t2=strtotime(is_array($b)?$b[$key]:$b->$key); 
      if($t1==$t2) return 0; 
      return (str_to_upper($dir)=='ASC'?($t1 < $t2):($t1 > $t2)) ? -1 : 1; 
     }; 
    } 


    // $sort - key or property name 
    // $dir - ASC/DESC sort order or empty 
    usort($arr, build_sorter($sort, $dir)); 
संबंधित मुद्दे