1

I need to sort a array on some condition.

Array
(
    [0] => Array
        (
            [entity_id] => 10
            [product_id] => 424
            [city] => 18
            [sort_order] => 10
            [deal_type_id] => dow
            [deal_from_date] => 2010-12-18
            [deal_to_date] => 2026-02-19
        )

    [1] => Array
        (
            [entity_id] => 11
            [product_id] => 423
            [city] => 18
            [sort_order] => 11
            [deal_type_id] => dow
            [deal_from_date] => 2010-12-18
            [deal_to_date] => 2027-02-19
        )

    [2] => Array
        (
            [entity_id] => 12
            [product_id] => 422
            [city] => 18
            [sort_order] => 12
            [deal_type_id] => dow
            [deal_from_date] => 2011-12-18
            [deal_to_date] => 2030-01-19
        )

    [3] => Array
        (
            [entity_id] => 13
            [product_id] => 420
            [city] => 18
            [sort_order] => 13
            [deal_type_id] => dow
            [deal_from_date] => 2011-12-18
            [deal_to_date] => 2030-01-19
        )

    [4] => Array
        (
            [entity_id] => 1
            [product_id] => 463
            [city] => 18
            [sort_order] => 1
            [deal_type_id] => dod
            [deal_from_date] => 2013-12-18
            [deal_to_date] => 2025-01-19
        )

    [5] => Array
        (
            [entity_id] => 2
            [product_id] => 452
            [city] => 18
            [sort_order] => 2
            [deal_type_id] => dom
            [deal_from_date] => 2013-12-18
            [deal_to_date] => 2026-01-19
        )

    [6] => Array
        (
            [entity_id] => 3
            [product_id] => 448
            [city] => 18
            [sort_order] => 3
            [deal_type_id] => dod
            [deal_from_date] => 2013-12-18
            [deal_to_date] => 2027-01-19
        )

    [7] => Array
        (
            [entity_id] => 4
            [product_id] => 441
            [city] => 18
            [sort_order] => 4
            [deal_type_id] => dod
            [deal_from_date] => 2013-12-18
            [deal_to_date] => 2024-01-19
        )

    [8] => Array
        (
            [entity_id] => 5
            [product_id] => 440
            [city] => 18
            [sort_order] => 5
            [deal_type_id] => dod
            [deal_from_date] => 2013-12-18
            [deal_to_date] => 2027-01-19
        )

    [9] => Array
        (
            [entity_id] => 6
            [product_id] => 439
            [city] => 18
            [sort_order] => 6
            [deal_type_id] => dom
            [deal_from_date] => 2013-12-18
            [deal_to_date] => 2028-01-19
        )

    [10] => Array
        (
            [entity_id] => 7
            [product_id] => 433
            [city] => 18
            [sort_order] => 7
            [deal_type_id] => dom
            [deal_from_date] => 2013-12-18
            [deal_to_date] => 2013-01-19
        )

    [11] => Array
        (
            [entity_id] => 8
            [product_id] => 427
            [city] => 18
            [sort_order] => 8
            [deal_type_id] => dod
            [deal_from_date] => 2013-12-18
            [deal_to_date] => 2022-01-19
        )

    [12] => Array
        (
            [entity_id] => 9
            [product_id] => 425
            [city] => 18
            [sort_order] => 9
            [deal_type_id] => dom
            [deal_from_date] => 2013-12-18
            [deal_to_date] => 2025-02-19
        )

)

I need to compare deal_from_date from previous to next key. if both are same then, i need to check grater value in deal_to_date. if i found both deal_to_date value is diffrent then sort as per greater first.

I tried.

for($i=0;$i<count($result);$i++)
{
    if(array_key_exists($i+1, $result))
    {
        if(strtotime($result[$i]['deal_from_date']) == strtotime($result[$i+1]['deal_from_date']))
        {
            echo $i;
            if(strtotime($result[$i]['deal_to_date']) < strtotime($result[$i+1]['deal_to_date']))
            { 
                $firstArray = $result[$i];
                unset($result[$i]);
                $secondArray = $result[$i+1];
                unset($result[$i]);
                $result[$i] = $secondArray;
                $result[$i+1] = $firstArray;
            }
        }
    }
}

I need this output.

Array
(

    [0] => Array
    (
        [entity_id] => 11
        [product_id] => 423
        [city] => 18
        [sort_order] => 11
        [deal_type_id] => dow
        [deal_from_date] => 2010-12-18
        [deal_to_date] => 2027-02-19
    )
    [1] => Array
        (
            [entity_id] => 10
            [product_id] => 424
            [city] => 18
            [sort_order] => 10
            [deal_type_id] => dow
            [deal_from_date] => 2010-12-18
            [deal_to_date] => 2026-02-19
        )

   [1] => Array
        (
            [entity_id] => 12
            [product_id] => 422
            [city] => 18
            [sort_order] => 12
            [deal_type_id] => dow
            [deal_from_date] => 2011-12-18
            [deal_to_date] => 2030-01-19
        )

    [2] => Array
        (
            [entity_id] => 13
            [product_id] => 420
            [city] => 18
            [sort_order] => 13
            [deal_type_id] => dow
            [deal_from_date] => 2011-12-18
            [deal_to_date] => 2030-01-19
        )

    [3] => Array
        (
            [entity_id] => 2
            [product_id] => 452
            [city] => 18
            [sort_order] => 2
            [deal_type_id] => dom
            [deal_from_date] => 2013-12-18
            [deal_to_date] => 2026-01-19
        )
    [4] => Array
        (
            [entity_id] => 1
            [product_id] => 463
            [city] => 18
            [sort_order] => 1
            [deal_type_id] => dod
            [deal_from_date] => 2013-12-18
            [deal_to_date] => 2025-01-19
        )



    [5] => Array
        (
            [entity_id] => 3
            [product_id] => 448
            [city] => 18
            [sort_order] => 3
            [deal_type_id] => dod
            [deal_from_date] => 2013-12-18
            [deal_to_date] => 2027-01-19
        )

       [6] => Array
        (
            [entity_id] => 6
            [product_id] => 439
            [city] => 18
            [sort_order] => 6
            [deal_type_id] => dom
            [deal_from_date] => 2013-12-18
            [deal_to_date] => 2028-01-19
        )
    [7] => Array
        (
            [entity_id] => 5
            [product_id] => 440
            [city] => 18
            [sort_order] => 5
            [deal_type_id] => dod
            [deal_from_date] => 2013-12-18
            [deal_to_date] => 2027-01-19
        )

[8] => Array
        (
            [entity_id] => 9
            [product_id] => 425
            [city] => 18
            [sort_order] => 9
            [deal_type_id] => dom
            [deal_from_date] => 2013-12-18
            [deal_to_date] => 2025-02-19
        )
    [9] => Array
        (
            [entity_id] => 4
            [product_id] => 441
            [city] => 18
            [sort_order] => 4
            [deal_type_id] => dod
            [deal_from_date] => 2013-12-18
            [deal_to_date] => 2024-01-19
        )


  [10] => Array
        (
            [entity_id] => 8
            [product_id] => 427
            [city] => 18
            [sort_order] => 8
            [deal_type_id] => dod
            [deal_from_date] => 2013-12-18
            [deal_to_date] => 2022-01-19
        )

    [11] => Array
        (
            [entity_id] => 7
            [product_id] => 433
            [city] => 18
            [sort_order] => 7
            [deal_type_id] => dom
            [deal_from_date] => 2013-12-18
            [deal_to_date] => 2013-01-19
        )





)

I need to sort array if deal multiple deal from date is same date. then sorting based on deal_to_date desc. only for same group.

AS Mackay
  • 2,831
  • 9
  • 19
  • 25
  • 1
    Welcome to SO! Your output is impossible: you can't have two items mapped to one index. Please clarify your intent. – ggorlen Jan 01 '19 at 18:20
  • 1
    What version of PHP do you run that can output two keys with index 1? Edit, sorry I see now that is your expected output. Is that a typo or are you expecting two index 1? – Andreas Jan 01 '19 at 18:22

2 Answers2

0

Simply use usort() function like this:

function sorter($a,$b){return $a["deal_from_date"]<=>$b["deal_from_date"]}
usort($array,sorter)

I hope that this will help you!

FZs
  • 16,581
  • 13
  • 41
  • 50
0

If I understand correctly, you're trying to sort by ascending deal_from_date first, and if they're equal, sort by descending deal_to_date.

You can do something like this, using usort:

usort($array, function (array $entry1, array $entry2) {
  return new \DateTime($entry1['deal_from_date']) <=> new \DateTime($entry2['deal_from_date'])
    ?: (new \DateTime($entry2['deal_to_date']) <=> new \DateTime($entry1['deal_to_date']));
});

Demo here: https://3v4l.org/esc9Q

You can add as many ?: (value1 <=> value2) as you'd like for fallback sorting.

Now this doesn't seem to produce the exact output you posted, but you should easily be able to adjust it from there.

Jeto
  • 14,596
  • 2
  • 32
  • 46