【问题标题】:According to the values within the array key value in php根据php中数组键值内的值
【发布时间】:2016-06-25 19:27:05
【问题描述】:

我有多个这样的数组:

$value1 = array ("10" => "car", "20" => "home", "30" => "ball");
$value2 = array ("50" => "car", "60" => "home", "70" => "ball");
$value3 = array ("100" => "car", "110" => "home", "120" => "ball");

现在我想按值合并这些数组,同时将键值合并在一起。

伪代码:

$endvalue = $value1 + $value2 + $value3;

print_r ($endvalue);

预期输出:

"160" => "car"
"190" => "home"
"220" => "ball"

我有一个这样的数据库;

名称 facebookCount tweetCount googleCount 汽车 20 50 100 家 50 60 10 球 30 10 70

..我想找到最共享的价值..

喜欢;

汽车(20 + 50 + 100)

家(50+ 60+10)

球(30 + 10 + 70)

..和列表

汽车 > 家 > 球

你能帮帮我吗?

【问题讨论】:

  • 当你得到两个重复的键时你会怎么做?您不能有重复的键。
  • 我有一个类似的数据库; name - facebookcount - tweetcount - googlecount car 20 50 100 home 50 60 10 home 30 10 70 ..我想学习的名字总数不超过
  • PHP 在数组中不能有重复的键。所以你必须考虑当这种情况发生时你想做什么。
  • 我分享我的数据库模型。你可以检查
  • 为什么不直接从您的数据库中选择总和?你使用 SQL 吗?你能显示你做的查询吗?

标签: php arrays merge addition


【解决方案1】:

使用array_valuesarray_combinearray_search 函数的非重复键输入数组的解决方案:

...
$arrList = [$value1, $value2, $value3];  // wrapping input arrays with outer array
$names = array_combine(array_values($value1), array_fill(0, count($arrList), 0));  // getting base names list

foreach ($names as $k => &$num) {
    foreach ($arrList as $arr) {
        $num += (int) array_search($k, $arr);
    }
}

print_r($names);

我认为最终的数组应该是一个关联数组,因为在某些情况下,分组名称之间的总和可能相同

输出:

Array
(
    [car] => 160
    [home] => 190
    [ball] => 220
)

【讨论】:

  • 但是当 facebook 和 twitter 的计数相同时,您会遇到问题。
  • @trincot,你是什么意思?
  • @RomanPerekhrest,这不是你的错,但 OP 开始的结构设计存在错误,因为如果值是这样的:array ("10" => "car", "10" => "home", "10" => "ball"); 数组实际上只会看起来像 array ("10" => "ball"); 这不是所需的输入(因此您的正确算法也会给出错误的结果)。
  • @trincot,是的,我确认我的解决方案适用于具有非重复键的输入数组。
  • @serhatgksu,对于数据库级别,您应该尝试通过执行类似select <name_column>, SUM(<number_column>) from <table_name> GROUP BY <name_column>的查询来获取每个名称的总和
【解决方案2】:

在您的情况下,SQL 解决方案可能会更快,而且实际上非常简单。简单的算术对于 SQL 来说是没有问题的。

考虑具有以下结构的表:

创建表“社交”( `name` varchar(50) NOT NULL, `facebook` int(11) NOT NULL, `twitter` int(11) NOT NULL, `google` int(11) NOT NULL, 主键(`名称`) );

然后这个查询:

SELECT name, (facebook + twitter + google) as shares FROM social
ORDER BY shares DESC

给你以下结果:

名称股份 车 170 家 120 球 110

我想没有太多解释,但如果有什么不清楚的地方,请随时询问。

【讨论】:

  • 感谢您的回答。
猜你喜欢
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
相关资源
最近更新 更多