【问题标题】:Custom function to map two arrays of which one is subset to check if those exist自定义函数来映射两个数组,其中一个是子集以检查它们是否存在
【发布时间】:2015-02-01 17:15:50
【问题描述】:

注意:致反对者和需要进一步澄清的人......

我试图找到一个解决方案,而不是遍历循环。即,我不想使用foreach 函数。

很抱歉这个疯狂的标题。我想要实现的是,我有两个数组,比如:

$full = array("Apple", "Orange", "Mango", "Guava", "Tomato");
$user = array("Apple", "Orange", "Tomato");

我将它作为 JSON 获取,并使用 json_decode() 将其从 JSON 转换为数组。现在我的问题是,我想将此输入用于我的函数,它会返回如下内容:

$userSelection = array(
    "Apple" => true,
    "Orange" => true,
    "Mango" => false,
    "Guava" => false,
    "Tomato" => true
);

为此,我可以这样做:

function userSelection ($full, $user)
{
    $final = array();
    foreach ($full as $fruit)
        if (in_array($fruit, $user))
            $final[$fruit] = true;
        else
            $final[$fruit] = false;
    return $final;
}

为了压缩一些位,我使用了这个。

function userSelection ($full, $user)
{
    $final = array();
    foreach ($full as $fruit)
        $final[$fruit] = in_array($fruit, $user);
    return $final;
}

我的问题是,还有其他更好的方法吗?

【问题讨论】:

  • 你在找什么?喜欢单线解决方案?
  • 你不能压缩比你在压缩函数中所做的更多...
  • 我不知道为什么我被否决了。不完全是单行答案,而是不使用foreach

标签: php arrays json performance coding-style


【解决方案1】:

如果你对性能分析感兴趣:foreach() 是 O(N)(命中 $full 中的每个元素),in_array 也是 O(N)(查看 $user 中的每个值),这样循环是最坏情况的 O(N^2) 操作。如果你有很多水果,那就是性能瓶颈。

您可以通过将 $full 本身转换为关联数组来减少这种情况:

$full = array("Apple" => false
      , "Orange" => false
      , "Mango" => false
      , "Guava" => false
      , "Tomato" => false);

那么userSelection就变成了:

function userSelection ($full, $user)
{
    // $full is passed by value (ie copied)
    foreach ($user as $fruit) {
        // check to avoid fruit injection attacks
        if (array_key_exists($fruit, $full))
            { $full[$fruit] = true; }
    return $full;
}

array_key_exists 应该是 O(log N) 或 O(1),具体取决于 PHP 的实现,而 for 循环保持 O(N),以获得最坏情况下的 O(N*log N) 性能。

当然,您需要很多种水果选项才能看到任何性能优势。

【讨论】:

    【解决方案2】:

    您可以使用array_intersect 查找$user 中的哪些元素在$full 和/或array_diff 中,或者$full 中的哪些元素不在$user 中

    【讨论】:

    • 我知道这一点。那好吧?
    猜你喜欢
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    相关资源
    最近更新 更多