第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用哪個 PHP 數(shù)組函數(shù)?

使用哪個 PHP 數(shù)組函數(shù)?

PHP
撒科打諢 2022-07-16 10:50:32
我對 PHP 中所有不同的數(shù)組函數(shù)感到非常困惑,我不知道在我的場景中哪個最適合使用。我有一個列出用戶注冊的數(shù)組和一個列出這些用戶的訂閱以及用戶訂閱日期的數(shù)組。用戶可以有多個訂閱,也可以根本沒有。一個例子是:$users = [    ['user_id' => 1, 'sign_up_date' => '2020-01-01 00:00:00'],    ['user_id' => 2, 'sign_up_date' => '2020-01-02 00:00:00'],    ['user_id' => 3, 'sign_up_date' => '2020-01-03 00:00:00'],    ...];$subscriptions = [    ['user_id' => 1, 'subscription_category' => 'abc', 'sign_up_date' => '2020-01-01 00:01:00'],    ['user_id' => 1, 'subscription_category' => 'def', 'sign_up_date' => '2020-01-01 00:02:00'],    ['user_id' => 1, 'subscription_category' => 'ghi', 'sign_up_date' => '2020-01-02 00:03:00'],    ['user_id' => 2, 'subscription_category' => 'jkl', 'sign_up_date' => '2020-01-02 00:01:00'],    ['user_id' => 2, 'subscription_category' => 'mno', 'sign_up_date' => '2020-01-03 00:02:00'],    ...];我試圖找到的是哪些用戶在他們的注冊日期訂閱了任何類別。所以在這種情況下,我想找到以下項目的數(shù)量:$usersWhoSubscribedOnSignUpDate = [1, 2];我能做的是:$results = [];foreach ($users as $user) {    foreach ($subscriptions as $subscription) {        $signUpDate = date('Y-m-d', strtotime($user['sign_up_date']));        $subscriptionDate = date('Y-m-d', strtotime($subscription['sign_up_date']));        if ($subscription['user_id'] === $subscription['user_id'] && $signUpDate === $subscriptionDate) {            $results[] = subscription['user_id'];        }    }}$results = array_unique($results);但這在我看來不是很優(yōu)雅,我相信許多 PHP 數(shù)組函數(shù)中的一個可以以某種方式簡化這個過程。array_intersect似乎不合適,因為它似乎不適用于這樣的多級數(shù)組。array_map似乎不合適,因為它沒有比較兩個數(shù)組的能力。array_uintersect_assoc似乎它可能是一個選項,但我無法理解“附加索引檢查”的含義或如何對數(shù)據(jù)進(jìn)行排序。我相信回調(diào)函數(shù)需要返回兩個對象之間的比較,所以也許這可以按sign_up_date屬性的時間戳排序?
查看完整描述

2 回答

?
慕標(biāo)琳琳

TA貢獻(xiàn)1830條經(jīng)驗 獲得超9個贊

您可以在 的一次迭代$users和一次迭代中執(zhí)行此操作$subscriptions,而不是$subscriptions在 中的每行一次迭代$users。隨著行數(shù)的增加,這可能會帶來顯著的性能改進(jìn)。


首先,構(gòu)建一個由 user_id 索引的用戶注冊日期的關(guān)聯(lián)數(shù)組,這樣您就不需要在每次需要查找日期時對其進(jìn)行迭代:


$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']];

    }

));


查看完整回答
反對 回復(fù) 2022-07-16
?
LEATH

TA貢獻(xiàn)1936條經(jīng)驗 獲得超7個贊

我要做的第一個想法是修改您的數(shù)組,以便通過鍵識別用戶(這是前兩行)。第三行將每個用戶的訂閱日期減少到最早,然后第四行查找注冊日期和最早訂閱日期匹配的地方。


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 ) );


查看完整回答
反對 回復(fù) 2022-07-16
  • 2 回答
  • 0 關(guān)注
  • 118 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號