php - Sort array based on the numbers and a certain piece of text that occurs within a string -
i have array got directory pdf files in using scandir
$array = array(7) {      [0]=> string(17) "q150824-spost.pdf"      [1]=> string(17) "s150826-spost.pdf"      [2]=> string(16) "s150826-spro.pdf"      [3]=> string(17) "t150827-spost.pdf"      [4]=> string(16) "t150827-spro.pdf"      [5]=> string(17) "v150825-spost.pdf"      [6]=> string(16) "v150825-spro.pdf"  }   i need sort array numbers in file name (eg. 150824 date) can using following:
usort($array, function($a, $b) {   return filter_var($a, filter_sanitize_number_int) - filter_var($b, filter_sanitize_number_int); });   the above gives me array sorted numbers (which want):
$array = array(7) {      [0]=> string(17) "q150824-spost.pdf"      [1]=> string(17) "v150825-spost.pdf"      [2]=> string(16) "v150825-spro.pdf"      [3]=> string(16) "s150826-spro.pdf"      [4]=> string(17) "s150826-spost.pdf"      [5]=> string(17) "t150827-spost.pdf"      [6]=> string(16) "t150827-spro.pdf"  }   however, in addition sort alphabetically spost , spro (the text before .pdf) i'm @ loss how achieve though?
if 2 strings in array have same numbers/date (eg. 150826) want sort spost first , spro.
this should work you:
first grab number , topic name out of file name preg_match_all() , assign variables. after sort topic, if numbers equal, otherwise numbers.
<?php       usort($arr, function($a, $b){         preg_match_all("/^\w(\d+)-(\w+)/", $a, $ma);         preg_match_all("/^\w(\d+)-(\w+)/", $b, $mb);          $numbera = $ma[1][0];         $numberb = $mb[1][0];          $topica = $ma[2][0];         $topicb = $mb[2][0];          if($numbera == $numberb){             return strcmp($topica, $topicb);         }          return $numbera > $numberb ? 1 : -1;      });       print_r($arr);  ?>   output:
array (     [0] => q150824-spost.pdf     [1] => v150825-spost.pdf     [2] => v150825-spro.pdf     [3] => s150826-spost.pdf     [4] => s150826-spro.pdf     [5] => t150827-spost.pdf     [6] => t150827-spro.pdf )      
Comments
Post a Comment