0

I have many arrays inside one array and I want to sort those arrays inside the array by two arguements. Those two arguments are on the hand true or false and on the other hand a unix timestamp. Here is an example:

array(3) => {
    array(3) { ["Sticky"]=> bool(true) ["Timestamp"]=> int(1507696669) ["Title"]=> string(12) "TestArtikel2" } 
    array(3) { ["Sticky"]=> bool(false) ["Timestamp"]=> int(1507696645) ["Title"]=> string(12) "TestArtikel1" } 
    array(3) { ["Sticky"]=> bool(true) ["Timestamp"]=> int(1507688257) ["Title"]=> string(4) "Home" }
}

I want to get it sorted by the newest timestamp. But also, I want all arrays which contains true sorted before the false arrays. At the end it should look like this:

 array(3) => {
    array(3) { ["Sticky"]=> bool(true) ["Timestamp"]=> int(1507696669) ["Title"]=> string(12) "TestArtikel2" }  
    array(3) { ["Sticky"]=> bool(true) ["Timestamp"]=> int(1507688257) ["Title"]=> string(4) "Home" }
    array(3) { ["Sticky"]=> bool(false) ["Timestamp"]=> int(1507696645) ["Title"]=> string(12) "TestArtikel1" }
}

My question now is, how can I do that? I have litteraly no idea, sorry..

This one doesn't work:

 foreach ($arr as $key => $row) {
    $bool[$key]  = $row["Sticky"];
    $time[$key] = $row["Timestamp"];
 }

$allNews = array_multisort($bool, SORT_DESC, $time, SORT_DESC, $allNews);

foreach($allNews as $article){
    var_dump($article);
    echo "<br>";
}

Kind regards

Jan
  • 23
  • 4

1 Answers1

1

Use array_multisort

Here is your code would be :

$arr = array(
            array(0=>TRUE,1=>1507696669,2=>"TestArtikel2"),
            array(0=>FALSE,1=>1507696645,2=>"TestArtikel1"),
            array(0=>TRUE,1=>1507688257,2=>"Home")
        );

var_dump($arr); // your array

foreach ($arr as $key => $row) {
    $bool[$key]  = $row[0];
    $time[$key] = $row[1];
}

array_multisort($bool, SORT_DESC, $time, SORT_DESC, $arr);

var_dump($arr); // Check your sorted array

OR

$arr = array(
                array(0=>TRUE,1=>1507696669,2=>"TestArtikel2"),
                array(0=>FALSE,1=>1507696645,2=>"TestArtikel1"),
                array(0=>TRUE,1=>1507688257,2=>"Home")
            );

var_dump($arr); // your array

array_multisort(array_column($arr, 0), SORT_DESC, array_column($arr, 1), SORT_DESC, $arr);

var_dump($arr); // Check your sorted array

Output What I get is as same as you want:

array (size=3)
  0 => 
    array (size=3)
      0 => boolean true
      1 => int 1507696669
      2 => string 'TestArtikel2' (length=12)
  1 => 
    array (size=3)
      0 => boolean false
      1 => int 1507696645
      2 => string 'TestArtikel1' (length=12)
  2 => 
    array (size=3)
      0 => boolean true
      1 => int 1507688257
      2 => string 'Home' (length=4)


array (size=3)
  0 => 
    array (size=3)
      0 => boolean true
      1 => int 1507696669
      2 => string 'TestArtikel2' (length=12)
  1 => 
    array (size=3)
      0 => boolean true
      1 => int 1507688257
      2 => string 'Home' (length=4)
  2 => 
    array (size=3)
      0 => boolean false
      1 => int 1507696645
      2 => string 'TestArtikel1' (length=12)

UPDATED

 $allNews = array(
                    array("Sticky"=>TRUE,"Timestamp"=>1507696669,"Title"=>"TestArtikel2"),
                    array("Sticky"=>FALSE,"Timestamp"=>1507696645,"Title"=>"TestArtikel1"),
                    array("Sticky"=>TRUE,"Timestamp"=>1507688257,"Title"=>"Home")
                );

        var_dump($allNews);

        array_multisort(array_column($allNews, "Sticky"), SORT_DESC, array_column($allNews, "Timestamp"), SORT_DESC, $allNews);

       foreach($allNews as $article){
           var_dump($article);
           echo "<br>";
       }
       // var_dump($allNews); 
Shaunak Shukla
  • 2,347
  • 2
  • 18
  • 29