Array Order με διπλό τρόπο

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
kapoios001
Δημοσιεύσεις: 403
Εγγραφή: 17 Φεβ 2011 12:26

Array Order με διπλό τρόπο

Δημοσίευση από kapoios001 » 29 Ιούλ 2012 08:21

Γεια σας,

Προσπαθώ να στοιχίσω ένα array σύμφωνα με τα παρακάτω:
- πρώτα θα εμφανίζονται τα elements με μικρότερο key character length
- πρώτα θα εμφανίζονται τα elements με max value

Για να επιτύχω το πρώτο χρησιμοποιώ:

Κώδικας: Επιλογή όλων

    function sortByLength($a,$b){
      if($a == $b) return 0;
      return &#40;strlen&#40;$a&#41; < strlen&#40;$b&#41; ? -1 &#58; 1&#41;;
    &#125;

    uasort&#40;$deals_tag,'sortByLength'&#41;;
Οπότε το array γίνεται:

Κώδικας: Επιλογή όλων

Array
&#40;
 &#91;/merchantProductFeed&#93; => 1
 &#91;/merchantProductFeed/merchant&#93; => 1
 &#91;/merchantProductFeed/merchant/prod/text&#93; => 158
 &#91;/merchantProductFeed/merchant/prod&#93; => 158
&#41;
Αλλά θέλω να εμφανίζεται έτσι:

Κώδικας: Επιλογή όλων

Array
&#40;
 &#91;/merchantProductFeed/merchant/prod&#93; => 158
 &#91;/merchantProductFeed/merchant/prod/text&#93; => 158
 &#91;/merchantProductFeed&#93; => 1
 &#91;/merchantProductFeed/merchant&#93; => 1
&#41;
με ποιον τρόπο μπορώ να κάνω αυτό το διπλό order;

Ευχαριστώ εκ των προταίρων.

Άβαταρ μέλους
xmavidis
Honorary Member
Δημοσιεύσεις: 1217
Εγγραφή: 02 Δεκ 2003 19:59
Τοποθεσία: Ηράκλειο

Array Order με διπλό τρόπο

Δημοσίευση από xmavidis » 29 Ιούλ 2012 14:04

Νομίζω το παρακάτω θα δουλέψει. Αρχικά χρησιμοποίησε την uasort στο αρχικό array σου με callback function την sortByNum() για να κάνεις sort στα values.

Έπειτα, για κάθε μοναδική τιμή στο array βρίσκεις τα keys που αντιστοιχούν και κάνεις sort σε αυτά.

Τέλος, φτιάχνεις ένα καινούργιο array και αφού έχεις κάνει sort τα keys το γεμίζεις.

Μάλλον θα υπάρχει πιο αποδοτικός τρόπος για να γίνει όλο αυτό αλλά αυτό μπόρεσα να φτιάξω στα λίγα λεπτά που είχα διαθέσιμα.

Κώδικας: Επιλογή όλων

<?php
  function sortByLength&#40;$a,$b&#41;&#123; 
      if&#40;$a == $b&#41; &#123;
      	return 0; 
      &#125;
      return &#40;strlen&#40;$a&#41; < strlen&#40;$b&#41; ? -1 &#58; 1&#41;; 
    &#125; 
    function sortByNum&#40;$a,$b&#41;&#123; 
      if&#40;$a == $b&#41; &#123;
      
      	return 0;
      &#125; 
      return &#40;$a > $b ? -1 &#58; 1&#41;; 
    &#125; 

// The initial array
$x&#91;"/merchantProductFeed/merchant/prod"&#93; = 158;
$x&#91;"/merchantProductFeed/merchant"&#93; = 1;
$x&#91;"/merchantProductFeed"&#93; = 1;
$x&#91;"/merchantProductFeed/merchant/prod/text"&#93; = 158;

// Print it
echo "<h1>No sort</h1>";
echo "<pre>";
print_r&#40;$x&#41;;
echo "</pre>";

// First sort values by number
uasort&#40;$x, 'sortByNum'&#41;;

// Now sort each array slice by key length
$startSlice = 0; // start of each slice
$y = array&#40;&#41;; // make a new array
foreach&#40;array_unique&#40;$x&#41; as $val&#41; &#123;
	// Find the keys with the same values
	$keys = array_keys&#40;$x, $val&#41;;
	$xslice = array_slice&#40;$x, $startSlice , count&#40;$keys&#41;, true&#41;;
	$startSlice = count&#40;$keys&#41;;
	usort&#40;$keys, 'sortByLength'&#41;;
	// Finally
	foreach&#40;$keys as $key&#41; &#123;
		$y&#91;$key&#93; = $val;
	&#125; 
&#125;

echo "<h1>Sorted</h1>";
echo "<pre>";
print_r&#40;$y&#41;;
echo "</pre>";
?>
I want to know God’s thoughts; the rest are details.
Albert Einstein

kapoios001
Δημοσιεύσεις: 403
Εγγραφή: 17 Φεβ 2011 12:26

Array Order με διπλό τρόπο

Δημοσίευση από kapoios001 » 29 Ιούλ 2012 16:19

Πραγματικά ευχαριστώ για την βοήθεια! Τελικά βρήκα μια ακόμη λύση με λιγότερες γραμμές:

Κώδικας: Επιλογή όλων

$k = $v = array&#40;&#41;;
foreach&#40;$deals_tag as $key => $value&#41;&#123;
    $k&#91;&#93; = $key;
    $v&#91;&#93; = $value;
&#125;

array_multisort&#40;$v, SORT_DESC, $k, SORT_ASC,  $deals_tag&#41;;
Ευχαριστώ και πάλι!

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης