我试图创建一个按日期排序的动态数组。让我试着解释一下。我是关注用户数组
$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等的数字。
答案 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