Προς το περιεχόμενο

Επεξεργασία array σε PHP - περιορισμός εμφάνισης δεδομένων με ίδιο value


philos

Προτεινόμενες αναρτήσεις

Καλησπέρα! :-)

 

Έχω το εξής πρόβλημα σε PHP.

Έχουμε έναν array της μορφής:

 

array (

41 => array(userid => 3, threadid => 41, other => 'lalal'),

15 => array(userid => 5, threadid => 15, other => 'xxdddddxx'),

8 => array(userid => 3, threadid => 8, other => 'lalal'),

11 => array(userid => 5, threadid => 11, other => 'xxxaax'),

12 => array(userid => 3, threadid => 12, other => 'lalal'),

15 => array(userid => 1, threadid => 15, other => 'xxsxx'),

19 => array(userid => 2, threadid => 19, other => 'xxaaxx')

)

 

(sorry για τη διπλή εμφάνιση του value του threadid, απλά έτσι με βόλεψε - το σημειώνω απλά για να δείξω ότι δεν ακολουθείται αύξοντας αριθμός 0, 1, 2, 3, 4 κτλ στο key).

 

Θέλω ένα PHP function που να δέχεται ως input τον array κι έναν integer (limit). Αν το limit είναι πχ 2, τότε θα πρέπει να μείνουν στον μεγάλο array 2 υπο-arrays με το ίδιο userid (προφανώς αν γενικά εμφανίζεται 1 φορά ένα userid, το τελικό αποτέλεσμα θα είναι να παραμείνει αυτό το 1 userid).

 

Κάτι σαν το GROUP BY της MySQL, αλλά με max 2 ή όποιο max ορίζεται στην function.

 

Να σημειώσω ότι δεν με πειράζει αν το function τσεκάρει από την αρχή τον πίνακα και αφαιρεί από τις πρώτες σειρές, καθώς ο συγκεκριμένος μεγάλος πίνακας γίνεται shuffle σε κάθε pageload. :-)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Καταρχάς, το array σου είναι άκυρο, έχει 2 φορές το ίδιο key (15). Αυτό σημαίνει ότι στην πραγματικότητα, το array σου δεν έχει 7 items, αλλά 6 (το 2ο "15" θα κάνει overwrite το 1ο). Μόνο και μόνο από αυτό, τα υπόλοιπα θα σου βγούν λάθος, μιας και δεν θα έχουν πρόσβαση στα πραγματικά δεδομένα.

 

Υποθέτοντας ότι αλλάζεις το παραπάνω σε κάτι μη-παράλογο, ορίστε:

$data = [
	['userid' => 3, 'threadid' => 41, 'other' => 'lalal'],
	['userid' => 5, 'threadid' => 15, 'other' => 'xxdddddxx'],
	['userid' => 3, 'threadid' => 8, 'other' => 'lalal'],
	['userid' => 5, 'threadid' => 11, 'other' => 'xxxaax'],
	['userid' => 3, 'threadid' => 12, 'other' => 'lalal'],
	['userid' => 1, 'threadid' => 15, 'other' => 'xxsxx'],
	['userid' => 2, 'threadid' => 19, 'other' => 'xxaaxx']
];

$ids = array_unique(array_column($data, 'userid'), SORT_NUMERIC);

$limitedGroups = array_map(function($id) use ($data) { // Gia ka8e userid
    $group = array_filter ($data, function ($item) use ($id) {
        return $id === $item['userid'];
    }); // Edw ta balame se group me bash to userid
    
    return array_slice($group, 0, 2); // Edw kaname to limit sto group
}, $ids);

var_dump($limitedGroups);
array(4) {
  [0]=>
  array(2) {
    [0]=>
    array(3) {
      ["userid"]=>
      int(3)
      ["threadid"]=>
      int(41)
      ["other"]=>
      string(5) "lalal"
    }
    [1]=>
    array(3) {
      ["userid"]=>
      int(3)
      ["threadid"]=>
      int(8)
      ["other"]=>
      string(5) "lalal"
    }
  }
  [1]=>
  array(2) {
    [0]=>
    array(3) {
      ["userid"]=>
      int(5)
      ["threadid"]=>
      int(15)
      ["other"]=>
      string(9) "xxdddddxx"
    }
    [1]=>
    array(3) {
      ["userid"]=>
      int(5)
      ["threadid"]=>
      int(11)
      ["other"]=>
      string(6) "xxxaax"
    }
  }
  [5]=>
  array(1) {
    [0]=>
    array(3) {
      ["userid"]=>
      int(1)
      ["threadid"]=>
      int(15)
      ["other"]=>
      string(5) "xxsxx"
    }
  }
  [6]=>
  array(1) {
    [0]=>
    array(3) {
      ["userid"]=>
      int(2)
      ["threadid"]=>
      int(19)
      ["other"]=>
      string(6) "xxaaxx"
    }
  }
}


Edit: Αν σε ενοχλεί το indexing του αποτελέσματος που δεν είναι συνεχές: $limitedGroups = array_values($limitedGroups);

Επεξ/σία από paparovic
  • Like 2
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ευχαριστώ για την απάντηση και τη λύση! :-)

 

Ναι, sorry, το διπλό key ήταν χάρην του παραδείγματος και μου ξέφυγε, στην πράξη δεν τίθεται τέτοιο θέμα.

 

Μια παρατήρηση μόνο σχετικά με τον τελικό array.

Με var_dump βλέπω ότι ο αρχικός (σωστός για το script μου πίνακας) ήταν της μορφής:

array(3) {
	[6] => array(13) {
        ["views"] => string(2)
        "40" ["threadid"] => string(1)
        "6" ["added_dateline"] => int(1477248221)["threadtitle"] => string(1)
        "1" ["username"] => string(5)
        "admin" ["userid"] => string(1)
        "1" ["musername"] => string(37)
        "admin" ["expiration_days"] => int(0)["preview_img_url"] => bool(false)["thread_seo_url"] => string(18)
        "showthread.php?6-1" ["forumid"] => string(1)
        "6" ["percentage"] => int(50)["forumtitle_trim"] => string(35)
        "ΧΧΧΧΧ"
    }[3] => array(13) {
        ["views"] => string(2)
        "42" ["threadid"] => string(1)
        "3" ["added_dateline"] => int(1477248210)["threadtitle"] => string(3)
        "FBI" ["username"] => string(5)
        "admin" ["userid"] => string(1)
        "1" ["musername"] => string(37)
        "admin" ["expiration_days"] => int(0)["preview_img_url"] => string(53)
        "ΥΥΥΥΥ" ["thread_seo_url"] => string(20)
        "showthread.php?3-FBI" ["forumid"] => string(1)
        "6" ["percentage"] => int(50)["forumtitle_trim"] => string(35)
        "ΖΖΖΖΖΖΖ"
    }[8] => array(13) {
        ["views"] => string(2)
        "17" ["threadid"] => string(1)
        "8" ["added_dateline"] => int(1477248229)["threadtitle"] => string(13)
        "Hi hi hi aala" ["username"] => string(5)
        "admin" ["userid"] => string(1)
        "1" ["musername"] => string(37)
        "admin" ["expiration_days"] => int(0)["preview_img_url"] => bool(false)["thread_seo_url"] => string(30)
        "showthread.php?8-Hi-hi-hi-aala" ["forumid"] => string(1)
        "4" ["percentage"] => int(50)["forumtitle_trim"] => string(31)
        "LLLLLL"
    }
}

... ενώ τώρα ο τελικός πίνακας έχει τη μορφή (δεν τον παραθέτω ολόκληρο χάρην συντομίας:

array(2) {
    [0] => array(1) {
        [0] => array(13) {
            ["views"] => string(2)
            "14" ["threadid"] => string(1)
            "7" ["added_dateline"] => int(1477248225)["threadtitle"] => string(7)
            "aASasAS" ["username"] => string(6)
            "trial4" ["userid"] => string(2)
            "16" ["musername"] => string(6)
            "trial4" ["expiration_days"] => int(0)["preview_img_url"] => bool(false)["thread_seo_url"] => string(24)
            "showthread.php?7-aASasAS" ["forumid"] => string(2)
            "50" ["percentage"] => int(50)["forumtitle_trim"] => string(19)
            "XXXXX"
        }
    }[1] => array(3) {
        [0] => array(13) {
            ["views"] => string(2)
            "46" ["threadid"] => string(2)
            "10" ["added_dateline"] => int(1477248236)["threadtitle"] => string(11)
            "laaaaa voix" ["username"] => string(5)
            "admin" ["userid"] => string(1)
            "1" ["musername"] => string(37)
            "admin" ["expiration_days"] => int(0)["preview_img_url"] => bool(false)["thread_seo_url"] => string(29)
            "showthread.php?10" ["forumid"] => string(1)
            "7" ["percentage"] => int(50)["forumtitle_trim"] => string(10)
            "Test Forum"
        }
		[...]
    }
}

Πως μπορώ να το διορθώσω αυτό;

Δεν θέλω να αλλάζει τελική μορφή ο πίνακας, απλά να αφαιρούνται τα πολλαπλά υπο-arrays με το ίδιο userid βάσει του group.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...