【问题标题】:Merge arrays with same values合并具有相同值的数组
【发布时间】:2014-10-24 22:21:49
【问题描述】:

我有一个带有图形元素 id 的输入数组,我需要找到它们的组。我试图使用 array_search 和 array_marge 但没有成功。

我有一组兄弟姐妹:

'siblings' => 
    array (size=6)
      0 => 
        array (size=2)
          0 => int 0
          1 => int 1
      1 => 
        array (size=2)
          0 => int 2
          1 => int 3
      2 => 
        array (size=2)
          0 => int 3
          1 => int 5
      3 => 
        array (size=2)
          0 => int 4
          1 => int 6
      4 => 
        array (size=2)
          0 => int 4
          1 => int 7
      5 => 
        array (size=2)
          0 => int 6
          1 => int 7

我需要如下输出:

'groups' => 
    array (size=6)
      0 => 
        array (size=2)
          0 => int 0
          1 => int 1
      1 => 
        array (size=2)
          0 => int 2
          1 => int 3
          2 => int 5
      2 => 
        array (size=2)
          0 => int 4
          1 => int 6
          2 => int 7

我可以通过以下方式输出:

    $groups[] = array_unique(array_merge($siblings[0]));
    $groups[] = array_unique(array_merge($siblings[1],$siblings[2]));
    $groups[] = array_unique(array_merge($siblings[3],$siblings[4],$siblings[5]));

    var_dump($groups); // will output the previous output of groups

但我需要可以大规模使用的功能。

【问题讨论】:

  • 您如何确定组?我可能会假设您想要 3 个组,但是为什么您的示例中的第一组只有 2 个?
  • 组是包含合并的兄弟数组的数组。如果兄弟数组中的值之一存在于其他数组中,则应合并这些数组。
  • 啊,我明白你的意思了。感谢您的澄清。

标签: php arrays siblings array-merge


【解决方案1】:

它可能效率不高,但它确实有效。正常的想法是遍历数组,检查当前与剩余内部数组的交集。如果有交集,就将它们合并到当前,否则准备下一个数组集(循环并提取下一组):

$a = array('siblings' =>  array(array(0,1),array(2,3),array(3,5),
                                array(4,6),array(4,7),array(6,7)));
$g[] = $a["siblings"][0];
$round = array_slice($a["siblings"],1);
$temp = array();
$i = 0;

while(count($round) > 0){
  $v = array_shift($round);
  if(count(array_intersect($g[$i],$v)) > 0) 
      $g[$i] = array_unique(array_merge($g[$i],$v));
  else $temp[] = $v;
  if(count($round) == 0 && count($temp) > 0) {
    $g[] = $temp[0]; 
    $i++;
    $round = array_slice($temp,1);
    $temp = array();
  }
}
$groups["groups"] = $g;
var_dump($groups);

结果:

array(1) { 
   ["groups"]=> array(3) {
                [0]=> array(2) { 
                       [0]=> int(0) 
                       [1]=> int(1) } 
                [1]=> array(3) { 
                       [0]=> int(2) 
                       [1]=> int(3) 
                       [3]=> int(5) } 
                [2]=> array(3) { 
                       [0]=> int(4) 
                       [1]=> int(6) 
                       [2]=> int(7) } } }

【讨论】:

  • 在这种情况下使用array_pop 可能比array_shift 更好。这个想法是从$round 中获取并删除每个元素。但是输出元素的顺序会改变(虽然我认为这不重要)。
  • @user3173246 很高兴知道,如果它有帮助,请接受答案(通过单击灰色刻度线)。我知道您是 SO 新手。
【解决方案2】:

也许这样的事情会奏效。它不会将兄弟姐妹相互比较。相反,它会展平数组,删除重复项,然后将其分成 3 个组。

<?php

$siblings = array(
    array(0, 1),
    array(2, 3),
    array(3, 5),
    array(4, 6),
    array(4, 7),
    array(6, 7),
);

$merged = array();
$grouped = array();

for ($i = 0; $i < count($siblings); $i++) {
    array_push($merged, $siblings[$i][0]);
    array_push($merged, $siblings[$i][1]);
}

$merged = array_unique($merged);
$merged = array_chunk($merged, 3);

print_r($merged);

?>

给出以下输出:

Array
(
    [0] => Array
        (
            [0] => 0
            [1] => 1
            [2] => 2
        )

    [1] => Array
        (
            [0] => 3
            [1] => 5
            [2] => 4
        )

    [2] => Array
        (
            [0] => 6
            [1] => 7
        )

)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 2014-10-08
    • 1970-01-01
    相关资源
    最近更新 更多