【问题标题】:Set default output value if frequency of all input elements is the same如果所有输入元素的频率相同,则设置默认输出值
【发布时间】:2017-10-28 20:10:04
【问题描述】:

大家好,我几乎不需要在这里问,因为搜索总是会产生我正在寻找的答案,但这次我只是不知道要搜索什么。

以下代码按预期工作并显示所需的结果。

注意:总是只能有 3 个结果,即“平均”、“高于平均”或“低于平均”;示例:

$test1 = 'Average';
$test2 = 'Above average';
$test3 = 'Average';

$mystuff = array($test1, $test2, $test3);
$result = array_count_values($mystuff);
asort($result);
end($result);
$answer = key($result);
echo 'Averaging : ' . $answer;

工作示例:

输入:$test1='Average'$test2='Above average'$test3='Average'

预期输出:Averaging : Average (这是正确的,因为它是数组中出现频率最高的。)

问题是,当所有三个 $test 变量都不同时:

   $test1 = 'Above average';
   $test2 = 'Below average';
   $test3 = 'Average';

现在,$answer = Above average(即数组中的第一次出现)。

但是,我想在没有“频繁出现”的情况下设置一个默认值。

我想要的是这样的:

如果所有三个变量都不同,则$answer 必须始终显示“平均”,无论$test1$test2$test3 值如何。

我不希望您提供我需要的代码,只是指出我要搜索的内容的正确方向。

【问题讨论】:

  • 查看array_unique() 函数。如果唯一值的数量与值的总数相同,则您知道所有三个测试变量都是不同的。
  • 谢谢@rickdenhaan。我将研究 array_unique 函数。

标签: php arrays variables count default


【解决方案1】:

方法:

$result = array_count_values($mystuff);
if(sizeof($result)==1){                         // only one unique value
    $answer = key($result);                     // get lone element's value
}elseif(sizeof(array_flip($result))==1){        // if all value counts are same
    $answer = 'Average';                        // set default value
}else{
    arsort($result);                            // sort DESC
    $answer = key($result);                     // get first element's value
}
echo "Averaging : $answer";

输入/输出:

$mystuff=['Average','Below Average','Below Average'];        // Averaging : Below Average
$mystuff=['Average','Above Average','Below Average'];        // Averaging : Average
$mystuff=['Above Average','Above Average','Above Average'];  // Averaging : Above Average

只是一些说明,我选择了array_flip() 而不是array_unique(),因为它的执行速度更快,并且提供了同样有用的结果。

我可以只用两个条件编写我的方法,例如:

$result = array_count_values($mystuff);
if(sizeof($result)>1 && sizeof(array_flip($result))==1){
    $answer = 'Average';                        // set default value
}else{
    arsort($result);                            // sort DESC
    $answer = key($result);                     // get first element's value
}
echo "Averaging : $answer";

但是,这意味着arsort() 可能会毫无意义地对单元素数组进行排序。我的意思是,这没什么大不了的——尤其是因为 arsort() 速度很快,而且你的数组很小。所以,我想我的意思是,如果代码简洁对您很重要,请使用这种替代方法。

【讨论】:

  • 谢谢@mickmackusa。 IF ELSE 语句对我来说很有意义,您的回答显然产生了我正在寻找的确切结果。再次感谢。
  • 好像我很快就谈过了;当所有 3 个 $test 值都不同时,它将默认设置为 'average.这是正确的。
  • $mystuff=['Above Average','Above Average','Average']; // 平均:高于平均水平
  • 但是当所有 3 个 $test 值都相同时,例如 $mystuff=['Above Average','Above Average','Above Average']; // 平均:(应该)高于平均水平,但使用此代码,它默认为“平均”。我做错了吗?
  • 我的意思是我想要默认的“平均”,只有当所有 3 个 $test 值彼此不同时。我希望我的解释是正确的。
猜你喜欢
  • 1970-01-01
  • 2014-10-27
  • 2012-11-17
  • 1970-01-01
  • 1970-01-01
  • 2023-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多