2 回答
TA贡献1830条经验 获得超9个赞
您可以在 的一次迭代$users和一次迭代中执行此操作$subscriptions,而不是$subscriptions在 中的每行一次迭代$users。随着行数的增加,这可能会带来显着的性能改进。
首先,构建一个由 user_id 索引的用户注册日期的关联数组,这样您就不需要在每次需要查找日期时对其进行迭代:
$userDates = [];
foreach ($users as $user) {
$userDates[$user['user_id']] = date('Y-m-d', strtotime($user['sign_up_date']);
}
这会给你:
Array
(
[1] => 2020-01-01
[2] => 2020-01-02
[3] => 2020-01-03
)
然后只需遍历订阅一次,随时查找该用户的注册日期:
foreach ($subscriptions as $subscription) {
if (
date('Y-m-d', strtotime($subscription['sign_up_date'])) ===
$userDates[$subscription['user_id']]
) {
...
}
}
或者可能是这样的:
array_unique(array_filter(
$subscriptions,
function ($subscription) use ($userDates) {
return date('Y-m-d', strtotime($subscription['sign_up_date'])) ===
$userDates[$subscription['user_id']];
}
));
TA贡献1936条经验 获得超6个赞
我要做的第一个想法是修改您的数组,以便通过键识别用户(这是前两行)。第三行将每个用户的订阅日期减少到最早,然后第四行查找注册日期和最早订阅日期匹配的地方。
foreach( $users as $u ) { $signups[$u['user_id']] = date('Y-m-d', strtotime($u['sign_up_date']) ); }
foreach( $subscriptions as $s ) { $subs[$s['user_id']][] = date('Y-m-d', strtotime($s['sign_up_date']) ); }
foreach( $subs as $key => $value ) { $subs[$key] = min( $subs[$key] ); }
$results = array_keys( array_intersect_assoc( $signups, $subs ) );
- 2 回答
- 0 关注
- 93 浏览
添加回答
举报