组合2个不同长度的数组

Posted

技术标签:

【中文标题】组合2个不同长度的数组【英文标题】:Combine 2 arrays of different length 【发布时间】:2013-07-17 00:40:13 【问题描述】:

我有一个包含 100 个值的数组(array1)。我有另一个包含 8 个值的数组(array2)。我想从 array2 中获取值并将它们用作键并为这些键提取 array1 中的值。

array_combine 函数不起作用,因为它们的长度不同。

我试过了

function array_combine2($arr1, $arr2) 
    $count = min(count($arr1), count($arr2));
    return array_combine(array_slice($arr1, 0, $count), array_slice($arr2, 0, $count));

但这不起作用.....这给了我一个带有正确键的数组,但值不正确,我认为是因为它正在切片array1。

有人可以提供一些帮助吗?我知道,已经有大量关于这方面的文献,但它们都提供了与上述不起作用的解决方案非常相似的解决方案。

非常感谢您抽出宝贵的时间。

【问题讨论】:

你能举个例子吗?因为我认为您根据上下文使用“价值”一词来表示两种不同的事物,这令人困惑。有时您似乎将“值”表示为键值对中的“值”,而其他时候您将整个键值对称为“值”。请使用术语“键”、“值”和“条目”(又名键值对)重新措辞您的问题,eg “我有一个包含 100 个条目的数组我>...” 谢谢 Eric,你说得对,我的语言有点松散。数组太长,无法给您,但是,两个数组都包含键值对。 Array2 有 8 个八个键值对,array1 有 100 个。我只对获取 array2 中的值并在 array1 中查找键的值感兴趣,由 array2 中的值表示。 【参考方案1】:

类似这样的:

function combine($array1, $array2) 
    $array3 = array();
    foreach ($array2 as $key => $value)  //loop through all entries of array2

        //get the entry of array1 that corresponds to the value of array2's entry
        if (isset($array1[$value]) 
            $array3[$key] = $array1[$value] 
        
    

    return $array3;

我还没有测试过,但它应该给你一些思考。

【讨论】:

并检查$value键是否存在于$array1中。【参考方案2】:

试试这个。循环第二个数组并使用array2的值作为array1的索引从array1中提取值

foreach ( $array2 as $arr2 )
   $temp[]= $array[ $arr2 ];

return $temp;

【讨论】:

【参考方案3】:

你可以使用下面的代码

function array_combine2($arr1, $arr2) 
    foreach($arr2 as $val)
     $arr3[] = $arr1[$val];
     

    return $arr3;

对于白糖,

    $arr1['x'] = 2;
$arr1['y'] = 3;
$arr1['z'] = 4;

$arr2[0] = 'x';
$arr2[1] = 'y';
$arr2[2] = 'z';

上面的函数会返回下面的resbonse

$arr3[0] = 2;
$arr3[1] = 3;
$arr3[2] = 4;

【讨论】:

不幸的是,这不起作用。事实上,这些建议都没有奏效。 更详细一点,array1 是一个键值对。这里的值是医生在图像上给出的分数,这是关键。第二个数组也是一组键值对,但数组更小(总是更小)——键是图像编号,值是该图像的分数,但由不同的医生评分。基本上,我试图为医生 2 评分的一小部分图像提取医生 1 的所有分数。【参考方案4】:

不幸的是,array_slice() 将忽略基于键/索引的数组之间的任何关联。 array_slice() 使用 offset 值进行操作;这就是为什么它不适合这项工作。

array_intersect_key() 是使用另一个数组的键过滤数组的合适调用。

代码:(Demo)

for($char='A',$score=100; $score>0; ++$char,--$score)
    $dr_img_scores1["IMG_$char"]=$score;    // generate 100 unique elements

//var_export($dr_img_scores1);  // uncomment to see what this looks like

// eight arbitrary elements to use as extraction keys on $array1
$dr_img_scores2=['IMG_CL'=>13,'IMG_Z'=>44,'IMG_BP'=>82,'IMG_L'=>50,
                 'IMG_CD'=>2,'IMG_X'=>91,'IMG_BM'=>7,'IMG_AV'=>0];    

var_export(array_intersect_key($dr_img_scores1,$dr_img_scores2));
// notice that $dr_img_scores1's element order is preserved

输出:

array (
  'IMG_L' => 89,
  'IMG_X' => 77,
  'IMG_Z' => 75,
  'IMG_AV' => 53,
  'IMG_BM' => 36,
  'IMG_BP' => 33,
  'IMG_CD' => 19,
  'IMG_CL' => 11,
)

注意:如果$dr_img_scores1$dr_img_scores2 不按顺序排列,您可以在它们上使用ksort() 来同步它们的顺序,以便轻松直观地比较分数。

【讨论】:

@GhostRider 我昨天不恰当地将此页面用作重复链接。因为你的问题有点不清楚,所以我误会了你要求的任务。如果这是您正在寻找的内容,请授予绿色勾号,并可能更新您的问题以提高清晰度。如果我的回答没有产生正确的结果,请花点时间解释什么是不正确的。谢谢。

以上是关于组合2个不同长度的数组的主要内容,如果未能解决你的问题,请参考以下文章

输入n个数组,数组长度不等,每个数组取出一个数进行组合,求出所有的组合。

组合(cbind)不同长度的向量

不同长度且不重复的组合

在 Python 中,如何创建可变长度组合或排列?

数组(组合数学)

二维数组中长度为 8 的所有可能组合