2011-09-23 171 views
1

想知道是否有方法根据另一个数组和日期的键顺序对数组进行排序(usort或equiv)。我知道如何使用usort进行基本的日期排序,但是想知道你是否可以一举两得。按另一个数组顺序和日期排序PHP数组

$cats = array(1,6,3,4,7,2); 
$prods = array(
array('cat'=>1,'date'=>'1/3/2011'), 
array('cat'=>2,'date'=>'1/6/2011'), 
array('cat'=>3,'date'=>'2/3/2011') 
); 

我想$由$猫和$日期顺序的类别顺序排序电棒电棒

+2

您可能需要调整您的数据结构的位,但你应该能够与['array_multisort'(HTTP来实现:// WWW .php.net/manual/en/function.array-multisort.php) –

+1

我不明白你需要什么样的排序,顺便说一下,这甚至没有有效的代码 –

+0

我认为这个id在arr2中不是唯一的? –

回答

1

注意你的低接受率,因为它可以从抽出时间来回答您的问题震慑人心。请记住标记有效的答案为接受或以其他方式发表评论,解释他们为什么无效。

此解决方案在php 5.3+中运行良好,如果您被困在较旧的版本中,您可以使用strptime调用轻松替换DateTime对象。

将没有指定位置的类别的产品推送到列表的末尾(请参阅示例中的cat == 42产品)。

$cats = array(1,6,3,4,7,2); 

// added a few products to test the date sorting 
$prods = array(
    array('cat'=>1,'date'=>'3/3/2011'), 
    array('cat'=>1,'date'=>'2/3/2011'), 
    array('cat'=>1,'date'=>'1/3/2011'), 
    array('cat'=>42,'date'=>'2/3/2011'), 
    array('cat'=>2,'date'=>'1/3/2011'), 
    array('cat'=>2,'date'=>'2/3/2011'), 
    array('cat'=>2,'date'=>'1/6/2011'), 
    array('cat'=>3,'date'=>'2/3/2011') 
); 

// need an index of category_id => position wanted in the sort 
$r_cats = array_flip($cats); 
// if the category of a product is not found in the requested sort, we will use 0, and product with category id 0 will be sent to the end of the sort 
$r_cats[0] = count($r_cats); 
// this one is needed for DateTime, put whatever your timezone is (not important for the use we do of it, but required to avoid a warning) 
date_default_timezone_set('Europe/Paris'); 

usort($prods, function($a, $b) use($r_cats) { 
    $cat_a = isset($r_cats[$a['cat']]) ? $r_cats[$a['cat']] : $r_cats[0]; 
    $cat_b = isset($r_cats[$b['cat']]) ? $r_cats[$b['cat']] : $r_cats[0]; 

    if ($cat_a < $cat_b) { 
    return -1; 
    } elseif ($cat_a > $cat_b) { 
    return 1; 
    } 

    $date_a = DateTime::createFromFormat('j/n/Y', $a['date']); 
    $date_b = DateTime::createFromFormat('j/n/Y', $b['date']); 

    if ($date_a < $date_b) { 
    return -1; 
    } elseif ($date_a > $date_b) { 
    return 1; 
    } 

    return 0; 
}); 

var_dump($prods); 

结果如下:

array(8) { 
    [0]=> 
    array(2) { 
    ["cat"]=> 
    int(1) 
    ["date"]=> 
    string(8) "1/3/2011" 
    } 
    [1]=> 
    array(2) { 
    ["cat"]=> 
    int(1) 
    ["date"]=> 
    string(8) "2/3/2011" 
    } 
    [2]=> 
    array(2) { 
    ["cat"]=> 
    int(1) 
    ["date"]=> 
    string(8) "3/3/2011" 
    } 
    [3]=> 
    array(2) { 
    ["cat"]=> 
    int(3) 
    ["date"]=> 
    string(8) "2/3/2011" 
    } 
    [4]=> 
    array(2) { 
    ["cat"]=> 
    int(2) 
    ["date"]=> 
    string(8) "1/3/2011" 
    } 
    [5]=> 
    array(2) { 
    ["cat"]=> 
    int(2) 
    ["date"]=> 
    string(8) "2/3/2011" 
    } 
    [6]=> 
    array(2) { 
    ["cat"]=> 
    int(2) 
    ["date"]=> 
    string(8) "1/6/2011" 
    } 
    [7]=> 
    array(2) { 
    ["cat"]=> 
    int(42) 
    ["date"]=> 
    string(8) "2/3/2011" 
    } 
} 
+0

谢谢@Lepidosteus。我正在努力改进,花时间回复海报。我在<5.3,但我得到你在这里做的,并能够使其工作。 – daxiang28