How to sort a multidimensional array with stdClass objects by key values?

Yes, I searched and tried many methods, but nothing works. Here is my array:

Array ( [0] => stdClass Object ( [id] => 119 [name] => Business3 [start_date] => 1338789600 [end_date] => 1354604400 ) [1] => stdClass Object ( [id] => 153 [name] => Business1 [start_date] => 1338962400 [end_date] => 1370498400 ) [2] => stdClass Object ( [id] => 135 [name] => Business2 [start_date] => 1339653600 [end_date] => 1356937200 ) ) 

Basically I want to sort this by key, but every function I tried in Stackoverflow doesn't seem to work, just like in, I get a blank page without errors.

I tried this:

 function array_sort_by_column(&$arr, $col, $dir = SORT_ASC) { $sort_col = array(); foreach ($arr as $key=> $row) { $sort_col[$key] = $row[$col]; } array_multisort($sort_col, $dir, $arr); } array_sort_by_column(json_decode(json_encode($businesses), true), 'name'); 

But that did not work.

Any ideas?

+4
source share
3 answers

You are almost right, but $row[$col] trying to access objects such as an array. Instead, you want something like $row->{$col} . Here is a simpler, working example:

 $db = array( 0 => (object) array('name' => 'Business3'), 1 => (object) array('name' => 'Business2'), 2 => (object) array('name' => 'Business1') ); $col = 'name'; $sort = array(); foreach ($db as $i => $obj) { $sort[$i] = $obj->{$col}; } $sorted_db = array_multisort($sort, SORT_ASC, $db); print_r($db); 

Outputs:

 Array ( [0] => stdClass Object ( [name] => Business1 ) [1] => stdClass Object ( [name] => Business2 ) [2] => stdClass Object ( [name] => Business3 ) ) 
+9
source
 usort($array, function($a, $b) { return strcmp($a->name, $b->name); }); 
+2
source

You must use usort ...

So, you define a function that compares two objects (by name field), and then runs usort in an array, passing as the second argument.

Something like that:

 function cmp($a, $b) { if ($a["name"] == $b["name"]) { return 0; } return ($a["name"] < $b["name"]) ? -1 : 1; } usort ($my_array, "cmp"); var_dump($my_array); 

Hope this helps!

Ben

0
source

All Articles