PHP根据日期

时间:2017-06-01 18:20:31

标签: php arrays sorting multidimensional-array foreach

我试图创建一个按日期排序的动态数组。让我试着解释一下。我是关注用户数组

    $users = [
        0 => [
            'user_id' => 1,
            'user_date' => '2017-04-26',
            'user_name' => 'test',
        ],
        1 => [
            'user_id' => 2,
            'user_date' => '2017-04-26',
            'user_name' => 'test 2',
        ],
        2 => [
            'user_id' => 3,
            'user_date' => '2017-04-28',
            'user_name' => 'test 3',
        ]
    ];

在通过此阵列循环时,想要对具有相同日期的用户进行分组。输出应如何显示的示例

Array
(
    [0] => Array
        (
            [DATE] => 2017-04-26
            [USERS] => Array
                (
                    [0] => Array
                        (
                            [user_id] => 1
                            [user_title] => test
                        )

                    [1] => Array
                        (
                            [user_id] => 2
                            [user_title] => test 2
                        )

                )

        )

    [1] => Array
        (
            [DATE] => 2017-04-28
            [USERS] => Array
                (
                    [0] => Array
                        (
                            [user_id] => 4
                            [user_title] => test 4
                        )

                )

        )

)

我试图在foreach循环中做一些事情,但无法让它开始工作。

    $result = array();
    $i = 0;

    // Start loop
    foreach ($users as $user) {
        // CHECK IF DATE ALREADY EXISTS
        if(isset($result[$i]['DATE']) && $result[$i]['DATE'] == $user['user_date']){
            $i++;
        }

        // FILL THE ARRAY
        $result[$i] = [
            'DATE' => $user['user_date'],
            'USERS' => [
                'user_id' => $user['user_id'],
                'user_title' => $user['user_name'],
            ]
        ];
    }

我已经改变了一点:

   foreach ($users as $user => $properties) {
        foreach ($properties as $property => $value) {
            if($property == 'user_date'){
                if(empty($result[$value])){
                    $result[$i] = [];
                }
                $result[$i][] = [
                    'user_id' => $properties['user_id'],
                    'user_name' => $properties['user_name'],
                ];

                $i++;
            }
        }
    }

但是我怎么能把开始键(日期)改为等于0,1等的数字。

3 个答案:

答案 0 :(得分:2)

$users = [
        0 => [
            'user_id' => 1,
            'user_date' => '2017-04-26',
            'user_name' => 'test',
        ],
        1 => [
            'user_id' => 2,
            'user_date' => '2017-04-26',
            'user_name' => 'test 2',
        ],
        2 => [
            'user_id' => 3,
            'user_date' => '2017-04-28',
            'user_name' => 'test 3',
        ]
    ];

$sorted = [];

foreach ($users as $user => $properties) {
   foreach ($properties as $property => $value) {
      if ($property =='user_date') {
          if (empty($sorted[$value])) {
            $sorted[$value] = [];
          }
          $sorted[$value][] = $users[$user];
      }
   }
}

var_dump($sorted);

在数组中执行嵌套循环,然后检查您要查找的唯一值(在本例中为user_date),并将其作为已排序数组中的键添加。如果密钥存在,则向该密钥添加新项(用户),否则首先创建新密钥。这样,您就拥有一个日期数组,每个日期都包含具有该日期的用户数组。

答案 1 :(得分:1)

如果您想要显示的确切输出(老实说,我更喜欢Ryan的答案):

$result = array();
$i = 0;

// Start loop
foreach ($users as $user) {
    // CHECK IF DATE ALREADY EXISTS AND IS NOT IN THE SAME GROUP
    if (isset($result[$i]['DATE']) && $result[$i]['DATE'] != $user['user_date']){
        $i++;
    }

    // STARTING A NEW GROUP
    if(!isset($result[$i])) {
        $result[$i] = array(
            'DATE' => $user['user_date'],
            'USERS' => array()
        );
    }


    // FILL THE ARRAY (note the ending [] to add a new entry in this group's USERS array)
    $result[$i]['USERS'][] = array(
        'user_id' => $user['user_id'],
        'user_title' => $user['user_name'],
    );
}

答案 2 :(得分:0)

解决问题的方法很少。我总是喜欢使用PHP内置函数,因为它们有很多。这个答案使用PHP内置函数usort来对您的数组进行排序。它需要两个参数,即数组和比较器函数。 hdfs将解析两个数组对象到比较器函数。如果你不了解压缩函数,比较器会比较这两个对象并返回一个整数1,0或-1,它分别表示第一个对象是大于,等于还是小于第二个对象。因此传递比较器函数来处理日期的比较。

spark-csv