2012-07-25 108 views
1

我正在從項目中選擇數據庫中的多個項目(比如說20),並將它們存儲在數組中的緩存中。然後,當用戶單擊該項目時,我需要從該陣列中刪除該項目。PHP在多維數組中選擇鍵

而不是刪除緩存並在每次發生這種情況時重新觸發查詢(這是由同事建議的)我只想從緩存中刪除項目,並且只在有限的情況下重新激發查詢(比方說5)

在高速緩存中的項目數的陣列從高速緩衝存儲器來看起來像這樣:被選擇和向用戶顯示三個項目之前

[ 
    [ 
     'item_id' => 10001, 
     'item_name' => "super-cool item", 
     'item_description' => "This item is awesome" 
    ], 
    [ 
     'item_id' => 10002, 
     'item_name' => "super-cool item", 
     'item_description' => "This item is awesome" 
    ], 
    [ 
     'item_id' => 10003, 
     'item_name' => "super-cool item", 
     'item_description' => "This item is awesome" 
    ] 
] 

的數組被混洗。

很顯然,我需要做的是根據item_id選擇一個項目,取消設置該項目的密鑰並重置緩存中的字段。

絆倒我的部分是根據item_id選擇項目,那麼做這件事最有效的方法是什麼?

+0

爲什麼不直接使用的itemid爲數組中的關鍵,當你從取db,那麼你可以'unset($ arr [$ item_id]);' – Crisp 2012-07-25 08:03:29

+0

我不是100%確定我明白你需要什麼,但這聽起來有點像JQuery和AJAX的工作。編輯:忽略。 – Pete 2012-07-25 08:04:39

回答

0

幾年來有什麼不同!櫃面其他人正在尋求解決類似的問題,這一點,對付它最好的辦法是這樣的方法:

$toDelete = 1234; 

$cache = array_filter($cache, function ($item) use ($toDelete) { 
    return (int) $item['id'] !== $toDelete; 
}); 
1

爲了刪除數組中的索引,可以使用unset()函數。 因爲你有,你可以只通過數組循環,並尋找適合的項目ID數組鍵這麼幾個值:

<?php 
$todeleteId=15; 
foreach ($cache as $key=>$value) { 
    if ($value['item_id']==$todeleteId) { 
    unset($cache($key); 
    break; 
    } 
} 

你也可以只設置數組鍵的項目編號,然後只是:

unset($todeleteId); 
+0

我已經考慮了這兩個選項,但是網站獲得了大量的流量,所以foreach()方法被謹慎使用,除了shuffle重置數組鍵之外,其他選項都可以。 – 2012-07-25 08:34:20

+1

@AndrewWillis如果你必須避免循環,你在編寫代碼時必須非常受限制。爲什麼不通過讓JavaScript處理你的數組來處理瀏覽器? – Pete 2012-07-25 08:41:25

+0

不要這麼快放棄foreach解決方案!當只有前三個項目顯示給用戶時,foreach循環最多可以運行3次,然後才能達到想要的位置。 – KTB 2012-07-25 08:42:06