按第一行字母顺序对二维数组进行多重排序,然后按第二行的“j F Y”日期进行排序

问题描述 投票:0回答:3

我一切就绪,没有错误,一切看起来都是正确的。我尝试按升序输出名称和日期,同时使用 print_r() 验证顺序。

$win = array(
    'Name' => array(
        'Jane Doe ',
        'Nash Patel ',
        'Joe Public '
    ), 
    'Date' => array(
        '7 October 2015 ',
        '14 October 2014 ',
        '12 October 2016 '
    )
);

foreach($win as $element => $namedate) {
    echo '<strong>' . $element . '</strong><br>';
    foreach($namedate as $both) {
        echo $both . '<br/>';
    }
}

foreach ($win as $c => $key) {
    $sort_date[] = $key['Date'];
    $sort_name[] = $key['Name'];
}
array_multisort($sort_name, SORT_ASC, $sort_date, SORT_ASC, $win);
print_r($win);

输出\

Array (
    [Date] => Array (
        [0] => 7 October 2015 
        [1] => 14 October 2014 
        [2] => 12 October 2016 
    )
    [Name] => Array (
        [0] => Jane Doe 
        [1] => Nash Patel 
        [2] => Joe Public 
    )
)
php arrays sorting multidimensional-array array-multisort
3个回答
1
投票

我已阅读文档,看来

array_multisort($sort_name, SORT_ASC, $sort_date, SORT_ASC, $win);

意味着 $win 将按名称和日期排序,但按名称排序比日期具有更高的优先级。

尝试添加更多具有不同日期的

Jane Doe
,以查看它们是否按日期排序。


0
投票

因为你说数组不需要一起排序,这里是如何拆分它们并分别排序。

$win = array('Name'=> 
                    array('Jane Doe ', 'Nash Patel ', 'Joe Public '), 
         'Date'=>
                    array('7 October 2015 ', '14 October 2014 ', '12 October 2016 '));


$dates = $win["Date"]; //split array
$names = $win["Name"]; //split array

usort($dates, "date_sort"); // custom sort on dates
asort($names); // sort names

var_dump($dates);
Var_dump($names);


function date_sort($a, $b) {
    return strtotime($a) - strtotime($b);
}

https://3v4l.org/kLjRh

输出:

array(3) {
  [0]=>
  string(16) "14 October 2014 "
  [1]=>
  string(15) "7 October 2015 "
  [2]=>
  string(16) "12 October 2016 "
}

 array(3) {
  [0]=>
  string(9) "Jane Doe "
  [2]=>
  string(11) "Joe Public "
  [1]=>
  string(11) "Nash Patel "
}

0
投票

使用多重排序时,所有数组参数必须包含相同的元素计数。您不需要附加

$win
作为最后一个参数来影响之前声明的元素。

将参数传递给函数时,任何可以通过引用修改的数组都将发生变化。直接从函数返回派生的任何参数都不会受到影响(并且无论如何都无法检索)。

由于日期格式不是“大端”,因此需要将其转换为一组可以简单排序的值。对每个值调用

strtotime()
将适当地生成 unix 时间戳整数。

代码:(演示

array_multisort(
    $win['Name'],
    array_map('strtotime', $win['Date']),
    $win['Date']
);
var_export($win);
© www.soinside.com 2019 - 2024. All rights reserved.