简体   繁体   English

根据不同的值对数组排序

[英]Sorting an array depending on different values

Lets say you have an array of days and openinghours for a shop like this: 假设您有一家这样的商店有很多天和营业时间:

Array
(
    [monday] => Array
        (
            [day] => Monday
            [isopen] => true
            [open] => 10:00
            [close] => 17:00
        )

    [tuesday] => Array
        (
            [day] => Tuesday
            [isopen] => true
            [open] => 10:00
            [close] => 17:00
        )

    [wednesday] => Array
        (
            [day] => Wednesday
            [isopen] => true
            [open] => 10:00
            [close] => 17:00
        )

    [thursday] => Array
        (
            [day] => Thursday
            [isopen] => true
            [open] => 10:00
            [close] => 17:00
        )

    [friday] => Array
        (
            [day] => Friday
            [isopen] => true
            [open] => 10:00
            [close] => 17:00
        )

    [saturday] => Array
        (
            [day] => Saturday
            [isopen] => false
            [open] => 11:00
            [close] => 14:00
        )

    [sunday] => Array
        (
            [day] => Sunday
            [isopen] => false
            [open] => 01:00
            [close] => 01:00
        )

)

now, i want to sort these babies like this: 现在,我想对这些婴儿进行如下排序:

monday - friday: 10:00-17:00
saturday-sunday: closed

lest say wednesday was closing 16:00 i would like this output: 免得星期三16:00结束,我想要这个输出:

monday-tuesday: 10:00-17:00
wednesday: 10:00-16:00
thursday-friday: 10:00-17:00
saturday-sunday: closed

That is, I want to sort them but still keep the order from top to bottom as the primary sorting. 也就是说,我想对它们进行排序,但仍将其自上而下的顺序作为主要排序。 So, how would you do it? 那么,你会怎么做? Loop them all and keep hours in memory and compare days is one option but is'nt there any nicer solution? 将它们全部循环并在内存中保留数小时并比较天数是一种选择,但是没有更好的解决方案吗?

EDIT: An actual array was requested, here it is: 编辑:请求一个实际的数组,在这里是:

$days = array(
            'monday' => array(
                    'day' => 'Monday',
                    'isopen' => true,
                    'open' => '10:00',
                    'close' => '17:00',
                ),
            'tuesday' => array(
                    'day' => 'Tuesday',
                    'isopen' => true,
                    'open' => '10:00',
                    'close' => '17:00',
                ),
            'wednesday' => array(
                    'day' => 'Wednesday',
                    'isopen' => true,
                    'open' => '10:00',
                    'close' => '17:00',
                ),
            'thursday' => array(
                    'day' => 'Thursday',
                    'isopen' => true,
                    'open' => '10:00',
                    'close' => '17:00',
                ),
            'friday' => array(
                    'day' => 'Friday',
                    'isopen' => true,
                    'open' => '10:00',
                    'close' => '17:00',
                ),
            'saturday' => array(
                    'day' => 'Saturday',
                    'isopen' => false,
                    'open' => '10:00', //Not used since isopen = false
                    'close' => '17:00', //Not used since isopen = false
                ),
            'sunday' => array(
                    'day' => 'Sunday',
                    'isopen' => false,
                    'open' => '10:00', //Not used since isopen = false
                    'close' => '17:00', //Not used since isopen = false
                )
        );

That is tricky, but not that impossible (and be aware it is a sort of merging rather than sorting): 这很棘手,但并非没有可能(请注意,这是一种合并而不是排序):

    $sorted = array();
    foreach($days as $k=>$v){

        $current = array(
            'open'=>$v['open'],
            'close'=>$v['close'],
            'isopen'=>$v['isopen'],
        );              

        if (empty($sorted) || $previous != $current ) {
            $sorted[] = array('firstDay'=>$k,'open'=>$v['open'],'close'=>$v['close']);
        } else
            $sorted[count($sorted)-1]['lastDay'] = $k;


        $previous = $current;   
    }

    print_r($sorted);

Something like: 就像是:

$newArray = array();
$dayCount = -1;
foreach ($days as $day) {
    if ( ($dayCount < 0) || 
         ($day['isopen'] != $newArray[$dayCount]['isopen']) || 
         ($day['open'] != $newArray[$dayCount]['open']) || 
         ($day['close'] != $newArray[$dayCount]['close']) ) {
        $newArray[++$dayCount] = array_merge(
            $day,
            array('dayTo' => '')
        );
    } else {
        $newArray[$dayCount]['dayTo'] = $day['day'];
    }
}
var_dump($newArray);

EDIT 编辑

From your posted initial array, this gives: 从您发布的初始数组中,可以得出:

array(2) {
  [0]=>
  array(5) {
    ["day"]=>
    string(6) "Monday"
    ["isopen"]=>
    bool(true)
    ["open"]=>
    string(5) "10:00"
    ["close"]=>
    string(5) "17:00"
    ["dayTo"]=>
    string(6) "Friday"
  }
  [1]=>
  array(5) {
    ["day"]=>
    string(8) "Saturday"
    ["isopen"]=>
    bool(false)
    ["open"]=>
    string(5) "10:00"
    ["close"]=>
    string(5) "17:00"
    ["dayTo"]=>
    string(6) "Sunday"
  }
}

If you have mismatched open and close values on "closed" days, then changing the if condition to 如果您在“休市”日的openclose价不匹配,则将if条件更改为

if ( ($dayCount < 0) || 
     ($day['isopen'] != $newArray[$dayCount]['isopen']) || 
     ($day['isopen'] && (($day['open'] != $newArray[$dayCount]['open']) || 
                         ($day['close'] != $newArray[$dayCount]['close']) ))) {

might help 可能有帮助

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM