[英]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
只包含滿足以下任一條件的元素:
數組$events
的元素應保持原樣,其中在rsvp_id
字段中包含一些值(不應為空)
數組$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.