【问题标题】:Is there a way to combine the results of array_count_values($arr1) and array_count_values($arr2) if $arr1 and $arr2 have elements with the same value? [duplicate]如果 $arr1 和 $arr2 具有相同值的元素,有没有办法组合 array_count_values($arr1) 和 array_count_values($arr2) 的结果? [复制]
【发布时间】:2013-02-22 06:18:52
【问题描述】:

如果$arr1$arr2 具有相同值的元素,有没有一种有效的方法来组合array_count_values($arr1)array_count_values($arr2) 的返回数组?

我正在尝试通过经典的“从包含 10 亿行搜索请求的文档中生成前 100 个搜索请求。”

我的方法是使用 unix split 将文档分割成较小的文件,用 array_count_values 计算每个文件中每个搜索词的出现次数,然后将所有这些文件缩减为具有列表按每个搜索查询的受欢迎程度降序排列。

编辑 例如

$arr1 = array('kurt', 'curt', 'kurt', 'dave', 'krist');
$arr2 = array('dave' 'dave', 'krist', 'krist');

array_count_values($arr1) // ('kurt' => 2, 'curt'=>1, 'dave'=>1, 'krist'=>1)
array_count_values($arr2) // ('dave' => 2, 'krist'=>2)

如何将两者结合形成以下数组

('kurt' => 2, 'dave'=>3, 'krist'=>3, 'curt'=>1)

【问题讨论】:

  • 能否请您给出 $arr1 和 $arr2 的值以及所需的 o/p 数组?
  • 是的 - 请给我 2 分钟的时间来写点什么
  • 你最多取两个??? dave = 2,应该是 3
  • 文档.. 它是什么?你是如何使用它的?

标签: php linux unix


【解决方案1】:

试试这个:

$arr1 = array('kurt', 'curt', 'kurt', 'dave', 'krist');
$arr2 = array('dave', 'dave', 'krist', 'krist');

$cnt_arr1  = array_count_values($arr1); // ('kurt' => 2, 'curt'=>1, 'dave'=>1, 'krist'=>1)
$cnt_arr2  = array_count_values($arr2); // ('dave' => 2, 'krist'=>2)

$res_arr   = array_merge_recursive($cnt_arr1,$cnt_arr2);

$res       = array();
foreach($res_arr as $key=>$val){
 if(is_array($val)){
    $res[$key]= array_sum($val);
 }else{
    $res[$key]= $val;
 }

}

echo "<pre>";
print_r($res);

【讨论】:

    【解决方案2】:

    试试这个:

    $arr = array_merge($arr1,$arr2);
    $count = array_count_values($arr);
    

    【讨论】:

    • 这个例子适用于一个小数据集,但是如果我有一个包含 10 亿个搜索请求的文档呢?要求是在工作节点上执行映射步骤,在主节点上执行归约步骤。假设$arr1$arr1 的大小之和大于单个工作节点上的RAM 量,则$arr1$arr2 的大小分别小于RAM 量,但是array_count_values($arr1)array_count_values($arr2) 的返回值之和小于单个工作节点上的内存量
    【解决方案3】:

    请尝试以下代码。它会起作用的,

    $arr1 = array('kurt', 'curt', 'kurt', 'dave', 'krist');
    $arr2 = array('dave', 'dave', 'krist', 'krist');
    
    $array1Count = array_count_values($arr1); // ('kurt' => 2, 'curt'=>1, 'dave'=>1, 'krist'=>1)
    $array2Count = array_count_values($arr2); // ('dave' => 2, 'krist'=>2)
    $resultArray = array();
    foreach($array1Count as $key => $value) {
        if(array_key_exists($key, $array2Count)) {
            $resultArray[$key] = $array1Count[$key] + $array2Count[$key];
        }
        else {
            $resultArray[$key] = $array1Count[$key];
        }
        unset($array2Count[$key]);
    }
    $finalResultArray = array_merge($array2Count, $resultArray);
    print_r($finalResultArray);
    

    【讨论】:

    • @user784637:你试过了吗?
    猜你喜欢
    • 1970-01-01
    • 2022-12-04
    • 2022-12-18
    • 1970-01-01
    • 2022-01-04
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    相关资源
    最近更新 更多