2012-06-13 5 views
4

Да, я искал и пытался много методов, но ничего не работает. Вот мой массив:Как отсортировать многомерный массив с объектами stdClass по значениям ключа?

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 
     ) 
) 

Я в принципе хочу разобраться в этом с помощью ключа имени, но каждая функция я примерил Stackoverflow, кажется, не работает, как, я получаю пустую страницу без ошибок ,

Я попытался это:

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'); 

Но это не сработало.

Любые идеи?

ответ

8

Вы почти правы, но $row[$col] пытается получить доступ к объектам как массив. Вместо этого вы хотите что-то вроде $row->{$col}. Вот простой, рабочий пример:

$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); 

Выходы:

Array 
(
    [0] => stdClass Object 
     (
      [name] => Business1 
     ) 

    [1] => stdClass Object 
     (
      [name] => Business2 
     ) 

    [2] => stdClass Object 
     (
      [name] => Business3 
     ) 

) 
0

Вы должны использовать usort ...

Таким образом, можно определить функцию, которая сравнивает два объекта (в поле имени), а затем запустить usort на массив, передавая функции в качестве второго аргумента.

Что-то вроде этого:

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); 

Надежда, что помогает!

Бен

2
usort($array, function($a, $b) { 
    return strcmp($a->name, $b->name); 
}); 
Смежные вопросы