I want to sort associative array with specified sequence of values
$arr=array(array("company"=>"A", "revenue_range"=>"10-100M"),
array("company"=>"B", "revenue_range"=>"0-10M"),
array("company"=>"C", "revenue_range"=>"10-100M"),
array("company"=>"D", "revenue_range"=>"100M-1B"),
array("company"=>"E", "revenue_range"=>">1B"),
array( "company"=>"F", "revenue_range"=>"0-10M")
);
Result:-
$arr=array(array("company"=>"B", "revenue_range"=>"0-10M"),
array( "company"=>"F", "revenue_range"=>"0-10M"),
array("company"=>"A", "revenue_range"=>"10-100M"),
array("company"=>"C", "revenue_range"=>"10-100M"),
array("company"=>"D", "revenue_range"=>"100M-1B"),
array("company"=>"E", "revenue_range"=>">1B"));
You can use usort
and pass a comparison function that assigns the revenue_range strings numeric values (i.e. if "0-10M" is 1 and "10-100M" is 2, ... and ">1B" is 5, then you end up with ">1B" > "0-10M").
<?php
$arr = array(
array("company"=>"A", "revenue_range"=>"100 - 250M"),
array("company"=>"B", "revenue_range"=>"10 - 50M"),
array("company"=>"C", "revenue_range"=>"500M - 1B"),
array("company"=>"D", "revenue_range"=>"50 - 100M"),
array("company"=>"E", "revenue_range"=>">1B"),
array("company"=>"F", "revenue_range"=>"1 - 10M"),
array("company"=>"G", "revenue_range"=>"0 - 1M")
);
$order= array("0 - 1M", "1 - 10M", "10 - 50M", "50 - 100M", "100 - 250M", "250 - 500M", "500M - 1B", ">1B");
$order_by=array_flip($order);
usort($arr, function($a, $b) use($order_by) {
return $order_by[$a["revenue_range"]] - $order_by[$b["revenue_range"]];
});
echo "<pre>";
print_r($arr);