[英]How to get key based on value from a nested array?
這是我正在使用的嵌套數組的示例。 代表位置的“鍵”是720和715。嵌套的數組值是所述位置的服務。
從這些值可以看出,有些是重復的,有些是唯一的。 我希望能夠采用單個值或數組,例如4512、1110、685,然后查找相關的鍵。
因此4512將返回720。
到目前為止,完成的操作是:1)生成了我認為是格式正確的數組2)檢索了嵌套數組中的相交值
問題摘要:如何從其中一個值獲取密鑰。 抱歉,我沒有任何運氣嘗試過array_search()。
感謝任何幫助,我仍在學習數組。 謝謝。
array(
2
)
{
[720] => array(
4
)
{
[0] => int(4512) [1] => int(1110) [2] => int(1803) [3] => int(669)
}
[715] => array(
3
)
{
[0] => int(1803) [1] => int(685) [2] => int(669)
}
}
試圖通過結構,是會浪費很多時間,因為所有的項目需要在每次檢查中進行搜索,但如果你反其道而行,可以通過利用PHP的數組索引直接查找更有效的制造。 例如:
$arr = [
4512 => 720,
1110 => 720,
1803 => 715
];
echo $arr[4512]; // 720
甚至與主數據結構並行創建這樣的簡單索引也將使您從中受益。
如Sammitch所述 ,如果您有大型結構或計划執行許多查詢,則通過數組進行線性搜索以檢查每次搜索中的每個元素是一項昂貴且不必要的操作。 如果使用PHP函數array_flip()
,則可以在恆定時間內將鍵和值反轉並直接索引到數組中(這意味着無論數組有多大,如果您還沒有研究時間復雜度 ,都可以立即獲得索引)。
一個障礙:當輸入數組的值不是可哈希的類型時, array_flip()
不起作用,就像這里的情況。 因此,我們編寫了自己的array_flip()
,它將數組值轉換為鍵。
我假設任何重復的值都應產生一個鍵數組,該鍵映射到翻轉數組中。 如果需要,將策略更改為采用最后一個或第一個密鑰會減少代碼量。
function flip($arr) {
$flipped = [];
foreach ($arr as $k => $v) {
foreach ($v as $e) {
if (!array_key_exists($e, $flipped)) {
$flipped[$e] = $k;
}
else {
if (is_array($flipped[$e])) {
$flipped[$e][] = $k;
}
else {
$flipped[$e] = [$flipped[$e], $k];
}
}
}
}
return $flipped;
}
function find($needle, $haystack) {
return array_key_exists($needle, $haystack) ? $haystack[$needle] : false;
}
$arr = [
720 => [4512, 1110, 1803, 669],
715 => [1803, 685, 669]
];
$flipped = flip($arr);
echo "the flipped array: \n";
print_r($flipped);
echo "\n\nsearching for 1803: \n";
print_r(find(1803, $flipped));
echo "\n\n";
echo "searching for 1: \n";
print_r(find(1, $flipped));
echo "\n\n";
echo "searching for 4512: \n";
print_r(find(4512, $flipped));
echo "\n\n";
輸出:
the flipped array:
Array
(
[4512] => 720
[1110] => 720
[1803] => Array
(
[0] => 720
[1] => 715
)
[669] => Array
(
[0] => 720
[1] => 715
)
[685] => 715
)
searching for 1803:
Array
(
[0] => 720
[1] => 715
)
searching for 1:
searching for 4512:
720
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.