簡體   English   中英

如何遍歷所有內部數組元素並對原始多維數組進行修改?

[英]How to iterate over all the inner array elements and make modification to the original multidimensional array?

我是 PHP 數組的新手,我面臨着一項艱巨的任務,所以請理解我的情況。

我有一個名為$events的多維數組,如下所示:

//Output of print_r($events);
Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [rsvp_id] => 2
                    [event_id] => 237
                    [formatted_start_time] => 1443052800
                    [formatted_end_time] => 1443052800
                    [event_group_date] => 24 Sep, Thursday 2015
                )

            [1] => Array
                (
                    [rsvp_id] => 
                    [event_id] => 295
                    [formatted_start_time] => 1443070800
                    [formatted_end_time] => 1443070800
                    [event_group_date] => 24 Sep, Thursday 2015
                )

            [2] => Array
                (
                    [rsvp_id] => 
                    [event_id] => 294
                    [formatted_start_time] => 1443099600
                    [formatted_end_time] => 1443099600
                    [event_group_date] => 24 Sep, Thursday 2015
                )

            [3] => Array
                (
                    [rsvp_id] => 
                    [event_id] => 297
                    [formatted_start_time] => 1443101100
                    [formatted_end_time] => 1443101100
                    [event_group_date] => 24 Sep, Thursday 2015
                )

            [4] => Array
                (
                    [rsvp_id] => 
                    [event_id] => 296
                    [formatted_start_time] => 1443103200
                    [formatted_end_time] => 1443103200
                    [event_group_date] => 24 Sep, Thursday 2015
                )

            [5] => Array
                (
                    [rsvp_id] => 1
                    [event_id] => 330
                    [formatted_start_time] => 1443118800
                    [formatted_end_time] => 1443122400
                    [event_group_date] => 24 Sep, Thursday 2015
                )

            [6] => Array
                (
                    [rsvp_id] => 
                    [event_id] => 298
                    [formatted_start_time] => 1443124800
                    [formatted_end_time] => 1443124800
                    [event_group_date] => 24 Sep, Thursday 2015
                )

        )

    [1] => Array
        (
            [0] => Array
                (
                    [rsvp_id] => 2
                    [event_id] => 332
                    [formatted_start_time] => 1443189600
                    [formatted_end_time] => 1443193200
                    [event_group_date] => 25 Sep, Friday 2015
                )

        )

    [2] => Array
        (
            [0] => Array
                (
                    [rsvp_id] => 
                    [event_id] => 239
                    [formatted_start_time] => 1443571200
                    [formatted_end_time] => 1443571200
                    [event_group_date] => 30 Sep, Wednesday 2015
                )

        )

)

現在我想迭代上面數組中的每個事件,將每次迭代中的相應event_id傳遞給一個函數,接收函數返回的數組輸出,進行一些條件檢查並根據條件結果保留或刪除該特定上面數組中的事件元素。

例如,在一次迭代中,我必須將event_id 332 傳遞給一個函數,如下所示:

$aEventInvites = getInvites(332); //For understanding purpose only hard coded event_id is passed, actually it should be passed dynamically  during each iteration.

執行上述語句后,我收到以下結果:

    //Output of print_r($aEventInvites);
Array
(
    [0] => 2
    [1] => Array
        (
            [0] => Array
                (
                    [invite_id] => 698
                    [event_id] => 332
                    [type_id] => 0
                    [rsvp_id] => 0
                    [user_id] => 970
                    [invited_user_id] => 970
                )

            [1] => Array
                (
                    [invite_id] => 697
                    [event_id] => 332
                    [type_id] => 0
                    [rsvp_id] => 0
                    [user_id] => 244
                    [invited_user_id] => 244
                )

        )

)

注意:對於數組$events的每個event_id ,函數getInvites()應該被調用。

現在讓我們談談條件。 在此之前,請考慮以下聲明:

$looged_in_user_id = 244;

我想要的最終數組$events只包含滿足以下任一條件的元素:

  1. 數組$events的元素應保持原樣,其中在rsvp_id字段中包含一些值(不應為空)

  2. 數組$events的元素應保持原樣,其事件迭代輸出滿足以下條件:

    • invited_user_id應該與$logged_in_user_id相同,並且event_id應該存在於數組$aEventInvites

例如,在event_id = 332迭代的情況下,數組$aEventInvites包含以下兩個內容:

Array
                    (
                        [invite_id] => 697
                        [event_id] => 332
                        [type_id] => 0
                        [rsvp_id] => 0
                        [user_id] => 244
                        [invited_user_id] => 244
                    )

因此,在這種情況下,對event_id = 332 $events數組中的元素不做任何處理。

簡而言之,我希望最終的$events數組完全按照以下形式:

//Final required output of print_r($events);

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [rsvp_id] => 2
                    [event_id] => 237
                    [formatted_start_time] => 1443052800
                    [formatted_end_time] => 1443052800
                    [event_group_date] => 24 Sep, Thursday 2015
                )

            [1] => Array
                (
                    [rsvp_id] => 1
                    [event_id] => 330
                    [formatted_start_time] => 1443118800
                    [formatted_end_time] => 1443122400
                    [event_group_date] => 24 Sep, Thursday 2015
                )

        )

    [1] => Array
        (
            [0] => Array
                (
                    [rsvp_id] => 2
                    [event_id] => 332
                    [formatted_start_time] => 1443189600
                    [formatted_end_time] => 1443193200
                    [event_group_date] => 25 Sep, Friday 2015
                )

        )

)

注意:數組索引應該從 0 開始修改。 就像上面的預期輸出一樣。

有人請幫助我完成這項任務。 請隨時提出您對所需輸出的任何疑問。 謝謝。

我希望我的條件正確,至少我得到了與給定信息相同的結果:

function process(array $events, $logged_in_user_id) {
$newEvents = [];

foreach ($events as $i => $key) {
    if (is_array($key) && !isset($key["event_id"])) {
        foreach ($key as $index => $event) {
            if (is_array($event) && isset($event["event_id"])) {
                $conditions = false;
                if (!isset($event["rsvp_id"])) {
                    $aEventInvites = getInvites($event["event_id"]);

                    // try to match
                    foreach ($aEventInvites as $aeiKey => $aeiValue) {
                        if (is_array($aeiValue)) {
                            foreach ($aeiValue as $invites) {
                                if (isset($invites["invited_user_id"]) && isset($invites["event_id"])) {
                                    if (
                                           $invites["invited_user_id"] == $logged_in_user_id
                                        && $invites["event_id"]        == $event["event_id"]
                                    ) {
                                        $conditions = true;
                                    }
                                }
                            }
                        }
                    }
                } else {
                    $conditions = true;
                }

                if ($conditions) {
                    $newEvents[] = $event;
                }
            }
        }
    }
}

return $newEvents;
}

你可以使用continue; 而不是最后一個循環中的 bool $conditions變量。 一般來說,如果您能夠修改getInvites($event_id)的輸出,我建議您將結果數組更改為 assoc 數組(意思是使用字符串索引代替數字索引,例如“num_of_invitees”和“invitees”),您可以然后直接訪問這些字段而不迭代結果(從而提高性能)。

這不是一個完美的解決方案,但至少是一個可行的解決方案。 玩得開心。

編輯:忘記小提琴鏈接: http : //ideone.com/XpNTRn

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM