2013-10-14 62 views
5

如果你有你在一個循環中填充像這樣任何數組$ P:在php中查找關聯數組中的值的索引?

$p[] = array("id"=>$id, "Name"=>$name); 

什麼是在名稱項,以搜索約翰最快的方法,如果找到,返回$ P指數?除了循環$ p之外,還有其他方法嗎?

我有多達5000個名字可以在$ p中找到,$ p也可以包含5000行。目前,我循環遍歷$ p查找每個名稱,如果找到,解析它(並將其添加到另一個數組中),將行從$ p拼接出來,並打破1,準備開始搜索5000個名稱中的下一個名稱。

我想知道是否有更快的方式來獲得索引,而不是通過$ p循環,例如isset類型的方式?

謝謝你看看球員。

+0

沒有別的辦法。你必須循環。PHP在內部不保留任何hashmap或類似的值;只是爲了鑰匙。 (通過你可以創建一個額外的數組,類型爲$ q [$ p [$ key]] = $ key;') – bwoebi

+0

OMG如果你不能使用數據庫來處理這麼大的數據,那麼不管別的什麼 – 2013-10-14 10:48:06

+0

唯一的方法是用$ p創建另一個包含所有名稱和索引的關聯數組(每個名稱不包含索引的索引都是索引),這應該與$ p一起維護。 – Tumtum

回答

4

好,所以我看到這個問題,你有獨特的ID,但名稱可能不是唯一的。

你可以初始化數組:

array($id=>$name); 

而且你的搜索可能是這樣的:

array_search($name,$arr); 

這將很好地工作在一個大海撈針將有一個的本地方法比你自己的實現更好的實現。

例如

$id = 2; 
$name= 'Sunny'; 
$arr = array($id=>$name); 
echo array_search($name,$arr); 

回聲2

主要優點在這個方法是代碼的可讀性。

+1

謝謝你們!我將與代碼一起玩,看看哪種解決方案最適合。 – Shaun

+1

array_search()正在完成這項工作!謝謝Sunny! – Shaun

1

如果您知道您將需要在同一個請求中執行許多這些類型的搜索,那麼您可以從它們創建索引數組。這將循環遍歷數組,每個索引需要創建一次。

$piName = array(); 
foreach ($p as $k=>$v) 
{ 
    $piName[$v['Name']] = $k; 
} 

如果你只需要執行每頁的一個或兩個搜索再考慮陣列移動到外部數據庫,創建索引存在。

+0

找到第一個條目(當然是相應的鍵)看起來不錯 - 如果他需要在源數組中使用相同的「Name」字段來保存多個條目,它將不符合OP的請求 –

+0

它會找到* last *實際上,它不同於OP的當前算法(找到第一個算法)。 –

+0

啊,是的,明白了。我的觀點是 - 如果以這種方式重建源數組,很明顯,這可能是失去多個值的原因。所以這個結構不能用於原創,而是可以使用_with_ it。 –

0
$index = 0; 
$search_for = 'John'; 
$result = array_reduce($p, function($r, $v) use (&$index, $search_for) { 
    if($v['Name'] == $search_for) { 
    $r[] = $index; 
    } 
    ++$index; 
    return $r; 
}); 

$結果將包含在$ P元素,其中,與主要Name元素的值爲John的所有索引。 (這當然只適用於以數字索引開始爲0,並在指數沒有「漏洞」數組)。


編輯:可能更容易,只需使用array_filter,但不會返回只有指數,但如果Name等於John所有數組元素 - 但指數將被保留:

$result2 = array_filter($p, function($elem) { 
    return $elem["Name"] == "John" ? true : false; 
}); 
var_dump($result2); 

什麼適合您的需求更好,RESP。哪一個可能更快,是你要弄清楚的。