[英]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.