【问题标题】:How to get key based on value from a nested array?如何根据嵌套数组中的值获取键?
【发布时间】:2018-09-22 01:07:00
【问题描述】:

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

【问题讨论】:

  • 你有没有试过的代码?
  • 应该669 返回720715 还是...?
  • 抱歉,我的问题有点含糊。在这种情况下,当值对两个数组都是唯一的时,我只会进行键查找。我不会处理大量数据,最多 2-4 个数组。

标签: php arrays


【解决方案1】:

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

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

【讨论】:

  • 感谢您提供冗长的示例和回答。我的解释不清楚,查找仅针对唯一值,而不是重复值。这个想法是唯一值我可以输出类似“嘿,这个服务只在这个位置可用(键值)。我会处理这个 - 顺便说一句,我对你所说的可散列类型的意思只有一个模糊的概念。我有哈希表的一般概念,但不是它如何应用于数据类型。如果你有时间,我会欢迎你的评论!
  • 我明白了。当前的代码适用于此;如果您进行查询并获得一个数组,则您没有获得唯一值,您的调用者可以将其视为 false。稍后,如果您改变主意并决定要使用该数组,则可以,但删除该部分很简单。 Hashable 表示在数组中是有效键的类型,如stringint——PHP 数组是散列。让我知道您是否希望我对此代码进行特定更新,并提供清晰的输入/输出以及您打算如何使用它。在那之前,我会坚持你所描述的用例可以接受这一点。
【解决方案2】:

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

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

echo $arr[4512]; // 720

即使像这样与主要数据结构并行创建一个简单的索引也会让您从中受益。

【讨论】:

  • 难以置信,我不知道你可以翻转数组。我想我用过一次,但忘记了那个功能。这种方法很有意义,谢谢。
猜你喜欢
  • 1970-01-01
  • 2013-12-31
  • 2021-06-11
  • 2021-09-27
  • 2017-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
相关资源
最近更新 更多