按ID分组数组值

时间:2018-03-29 00:45:05

标签: php arrays sorting

我正在尝试按ID组合数组,然后按日期排序。输出数组是:

    Array
(
    [abc] => Array
        (
            [0] => Array
                (
                    [id] => 7
                    [date] => 2018-03-28
                    [message] => test1
                )

            [1] => Array
                (
                    [id] => 81
                    [date] => 2018-03-27
                    [message] => test5
                )

            [2] => Array
                (
                    [id] => 7
                    [date] => 2018-03-27
                    [message] => test9
                )
            [3] => Array
                (
                    [id] => 5
                    [date] => 2018-03-25
                    [message] => test
                )

        )

)

如何仅显示按日期排序的唯一ID,以便显示:

id: 7 - 2018-03-28
id: 81 - 2018-03-27
id: 5 - 2018-03-25

3 个答案:

答案 0 :(得分:0)

您可以尝试:

<?php
$arr= array( 
    array( 'Id' => 7,
          'Date' => "2018-03-28", 
          'Message' => "test1" 
         ),
    array( 'Id' => 81,
          'Date' => "2018-03-27", 
          'Message' => "test2" 
         ),
    array( 'Id' => 7,
          'Date' => "2018-03-27", 
          'Message' => "test3" 
         ),
    array( 'Id' => 5,
          'Date' => "2018-03-25", 
          'Message' => "test4" 
         )
);

//Result array
$result = array();

// Check duplicate 'Id'
for($i=0;$i<(count($arr) -1);$i++)
{
    for($j=$i+1;$j<count($arr);$j++)
    {    
        if($arr[$j]['Id'] == $arr[$i]['Id'])
        {
            if($arr[$i]['Date'] >= $arr[$j]['Date'])
            {
                $arr[$j]['Date'] = $arr[$i]['Date'];
                $arr[$j]['Message'] = $arr[$i]['Message'];
            }
            else
            {
                $arr[$i]['Date'] = $arr[$j]['Date'];
                $arr[$i]['Message'] = $arr[$j]['Message'];
            }
        }
    }
}

// Remove value duplicate
for($i=0;$i<count($arr);$i++)
{
    if(count($result) == 0)
    {
        array_push($result, $arr[$i]);
    }
    else
    {
        $flgAdd = true;
        foreach($result as $data){
            if($data['Id'] == $arr[$i]['Id']){
                $flgAdd = false;
                break;
            }
        }
        if($flgAdd)
        {
            array_push($result, $arr[$i]);
        }
    }
}
var_dump($result);
?> 

希望没关系

答案 1 :(得分:0)

这是另一种利用PHP内置函数和数组以及用户定义函数的方法,如下所示:

<?php
$arr= [ [ 'Id' => 7,
          'Date' => "2018-03-28",
          'Message' => "test1"
          ],
         [ 'Id' => 81,
         'Date' => "2018-03-27",
         'Message' => "test2" 
          ],
         ['Id' => 7,
          'Date' => "2018-03-27",
          'Message' => "test3" 
         ],
         ['Id' => 5,
          'Date' => "2018-03-25",
          'Message' => "test4" 
         ] ];

function cmp($a, $b)
{
    if ($a['Date'] == $b['Date']) {
        return 0;
    }
    return ($a['Date'] < $b['Date']) ? -1 : 1;
}

usort($arr, 'cmp');

$dates = array_column($arr,'Date','Id');
arsort($dates);

foreach ($dates as $key => $value) {
        printf("id: %2d -  %s\n", $key, $value);
}

请参阅live code

我倾向于应用array_multisort()来排序$ arr。但是,我注意到了一个缺点。如果每个子阵列的元素的排序方式不同,则结果不会按预期发生;见here。通过使用usort()提供的自定义排序,将$ arr传递给函数以及用户定义函数的名称,可以巧妙地避免这个问题.cmp&#39;它将$ arr的一个元素与以下元素进行比较,检查&#39;日期&#39;的值。领域。因此,$ arr按其“&#39;日期”按升序排序。字段。

接下来,数组传递给array_column(),这个函数首先在PHP 5.5中首次亮相(您可以在标准扩展中查看内部C源代码&#39; s <强> array.c )。 array_column()在内部迭代数组。由于数组按日期值按升序排列,因此当函数提取&#34;日期&#34;时,那些id为相同的元素将体验具有较晚日期的元素将覆盖具有较早日期的那个元素。和&#34; Id&#34;来自$ arr的值因此,一个新的数组形成其值包含日期,而ids持有&#39; Id&#39;值。函数arsort在对日期值进行反向排序时保持键关联,因此它们以降序显示。

答案 2 :(得分:0)

没有循环,没有条件。您可以使用一些数组函数排序函数来实现它。

$data = [ [ 'Id' => 7,
          'Date' => "2018-03-28",
          'Message' => "test1"
          ],
         [ 'Id' => 81,
         'Date' => "2018-03-27",
         'Message' => "test2" 
          ],
         ['Id' => 7,
          'Date' => "2018-03-27",
          'Message' => "test3" 
         ],
         ['Id' => 5,
          'Date' => "2018-03-25",
          'Message' => "test4" 
         ] ];
//Sorting recursively to get higher date.
array_multisort($data);
//Creating array Id as key Date as value. duplicate Id as key will be automatically overwriten.
$result = array_column($data, 'Date', 'Id');
//Sorting associative array in your desired output
arsort($result);
//Printing data
print_r($result);

输出

Array
(
    [7] => 2018-03-28
    [81] => 2018-03-27
    [5] => 2018-03-25
)

Demo