如何从嵌套数组中获取基于值的键?

时间:2018-09-22 01:07:01

标签: php arrays

这是我正在使用的嵌套数组的示例。代表位置的“键”是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)
        }
    }

2 个答案:

答案 0 :(得分:0)

尝试按原样搜索该结构将浪费大量时间,因为每次都需要检查所有个条目,但是如果您将其反转,则可以做得更多通过利用PHP的数组索引进行直接查找来提高效率。例如:

$arr = [
  4512 => 720,
  1110 => 720,
  1803 => 715
];

echo $arr[4512]; // 720

即使与主数据结构并行创建这样的简单索引,您也可以从中受益。

答案 1 :(得分:0)

mentioned by Sammitch一样,如果您有大型结构或计划执行许多查询,则通过数组进行线性搜索以检查每次搜索中的每个元素是一项昂贵且不必要的操作。如果您使用PHP函数array_flip(),则可以在恒定时间内将键和值反转并直接索引到数组中(即立即,无论您的数组有多大,如果没有的话)刚刚研究time complexity

一个障碍: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

Try it here

相关问题