Сортировка массивов по дате

У меня вопрос. Я создаю массив, получая данные из mysql и объединяя три результата запроса в одном массиве.

Я помещал данные в массив следующим образом:

while ($a = mysql_fetch_object($activities)) { $a->type = 1; $array1[] = $a; } while ($k = mysql_fetch_object($fuups)) { $k->type = 2; $array1[] = $k; } while ($x = mysql_fetch_object($refuups)) { $x->type = 3; $array1[] = $x; } return (object)$array1; 

Это возвращает что-то вроде этого:

 stdClass Object ( [0] => stdClass Object ( [added] => 2012-01-17 07:33:53 [type] => 1 ) [1] => stdClass Object ( [added] => 2012-01-13 06:36:22 [type] => 1 ) [2] => stdClass Object ( [added_type_2] => 2012-01-09 04:01:12 [type] => 2 ) [3] => stdClass Object ( [added_type_2] => 2012-02-08 02:08:32 [type] => 2 ) [4] => stdClass Object ( [added_type_2] => 2012-01-25 00:09:08 [type] => 2 ) [5] => stdClass Object ( [added_type_3] => 2012-01-23 00:09:08 [type] => 3 ) [6] => stdClass Object ( [added_type_3] => 2012-01-22 00:09:08 [type] => 3 ) ) 

Я пробовал такие вещи, как asort, ksort, сортировать, но не повезло. также получая даты с «заказом, добавив desc» спасибо

Solutions Collecting From Web of "Сортировка массивов по дате"

Вы можете использовать usort (), если вы измените объект fetch для извлечения связывания:

 function my_date_sort($a,$b) { if(isset($a[0]) && isset($b[0])) { $a = strtotime($a[0]); // optionally convert to time $b = strtotime($b[0]); if($a == $b) return 0; else return ($a > $b) ? 1 : -1; } else { // no valid subs, change this to put empty ones on top or bottom return 1; // put at bottom, -1 would put at top. } usort($results, 'my_date_sort'); 

Удачи…

То, что вы пытаетесь сделать, – это сортировать многомерный массив, вы можете найти много о Google об этом. Хорошим элегантным решением было бы что-то вроде:

 // Sort the multidimensional array usort($results, "custom_sort"); // Define the custom sort function function custom_sort($a,$b) { return $a['some_sub_var']>$b['some_sub_var']; } 

ИЗМЕНИТЬ 1:

Для тех, кто в комментариях сомневается, будет ли этот код работать, пожалуйста, не стесняйтесь попробовать (я даже добавил в дату, которая является дубликатом для целей тестирования):

 function custom_sort($a,$b) { return $a['added']>$b['added']; } $arrayToSort = array( array( "added" => "2012-01-17 07:33:53", "type" => "1" ), array( "added" => "2012-01-13 06:36:22", "type" => "1" ), array( "added" => "2012-01-09 04:01:12", "type" => "2" ), array( "added" => "2012-02-08 02:08:32", "type" => "2" ), array( "added" => "2012-01-25 00:09:08", "type" => "2" ), array( "added" => "2012-01-13 06:36:22", "type" => "1" ), array( "added" => "2012-01-13 06:36:22", "type" => "1" ), array( "added" => "2012-01-23 00:09:08", "type" => "3" ), array( "added" => "2012-01-22 00:09:08", "type" => "3" ) ); usort($arrayToSort, "custom_sort"); echo '<pre>'; print_r($arrayToSort); echo '</pre>'; 

Хорошим местом для быстрого тестирования было бы перейти на http://writecodeonline.com/php/ .

Вероятно, вы должны использовать UNION при выборе и не пытаться сортировать массивы самостоятельно. В любом случае, если вы можете использовать usort следующим образом:

 function cmp( $a, $b){ if( !($a instanceOf stdClass) && !($b instanceOf stdClass)){ return 0; } // Check object if( !($a instanceOf stdClass)){ return -1; } if( !($b instanceOf stdClass)){ return 1; } $aVal = NULL; if( isset( $a->added)){ $aVal = $a->added; } elseif( isset( $a->added_type_2)){ $aVal = $a->added_type_2; } ... // The same for b if( ($aVal == NULL) && ($bVal == NULL)){ return 0; } if( $aVal == NULL){ return -1; } if( $bVal == NULL){ return 1; } if( $aVal == $bVal){ return 0; } return ($aVal > $bVal) ? 1 : -1; } usort( $array, 'cmp'); 

Как вы можете видеть, как сравнить объект, может возникнуть сложность, если у вас есть правильные типы и правильные значения. При выборе столбцов mysql вы должны использовать как минимум SELECT added_type_2 AS added что имена столбцов более компактны и условия проще.