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

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

Δημοσ.

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

 

Έχω το εξής πρόβλημα σε 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.

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

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

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

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

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

Σύνδεση

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

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