合并两个数组,按一列分组,并与另一列形成单个分隔字符串

问题描述 投票:0回答:4

这是两个相似的数组,我想按请求的方式加入这个数组。我怎样才能做到这一点。

$arr1 = array( 
    array(
        'Class' => 'Class 1',
        'Student' => array('Name one')
    ),
    array(
        'Class' => 'Class 2',
        'Student' => array('Name one')
    ),
);

$arr2 = array( 
    array(
        'Class' => 'Class 1',
        'Student' => array('Name two, Name three')
    ),
    array(
        'Class' => 'Class 2',
        'Student' => array('Name Two, Name Three, Name Four')
    ),
);

想要的结果:

$result = array( 
    array(
        'Class' => 'Class 1',
        'Student' => array('Name one, Name two, Name three')
    ),
    array(
        'Class' => 'Class 2',
        'Student' => array('Name one, Name Two, Name Three, Name Four')
    ),
);

两个数组包含相同的行数和相同的列,但列值不同。

php arrays multidimensional-array merge grouping
4个回答
2
投票

您可以在其中使用

array_map
,如下所示:

$arr1 = array(
    array('Class' => 'Class 1','Student' => array('Name one')),
    array('Class' => 'Class 2','Student' => array('Name one')),
);

$arr2 = array( 
    array('Class' => 'Class 1','Student' => array('Name two, Name three')),
    array('Class' => 'Class 2','Student' => array('Name Two, Name Three, Name Four')),
);

$newList = [];
array_map(function($value, $list) use (&$newList) {
    $newList[] = ['Class' => $value['Class'], 'Student' => array_merge($value['Student'], $list['Student'])];
}, $arr1, $arr2);
print_r($newList);

这将输出:

Array (
    [0] => Array ( 
        [Class] => Class 1 
        [Student] => Array ( [0] => Name one [1] => Name two, Name three ) 
    ) 
    [1] => Array (
        [Class] => Class 2 
        [Student] => Array ( [0] => Name one [1] => Name Two, Name Three, Name Four ) 
    ) 
)

现场示例:https://3v4l.org/nWNZj


更新

正如 @mickmackusa 所提到的,您可能只想将学生数组连接为字符串,

所以这就能解决问题,

$arr1 = array(
    array('Class' => 'Class 1','Student' => array('Name one')),
    array('Class' => 'Class 2','Student' => array('Name one')),
);

$arr2 = array( 
    array('Class' => 'Class 1','Student' => array('Name two, Name three')),
    array('Class' => 'Class 2','Student' => array('Name Two, Name Three, Name Four')),
);

$newList = [];
array_map(function($value, $list) use (&$newList) {
    $newList[] = ['Class' => $value['Class'], 'Student' => array($value['Student'][0] . ', ' . $list['Student'][0])];
}, $arr1, $arr2);
print_r($newList);

这将输出一个连接的数组元素,如下所示:

Array (
    [0] => Array (
        [Class] => Class 1 
        [Student] => Array ( [0] => Name one, Name two, Name three ) 
    )
    [1] => Array (
        [Class] => Class 2 
        [Student] => Array ( [0] => Name one, Name Two, Name Three, Name Four ) 
    ) 
)

实时示例:https://3v4l.org/JIeDr


0
投票

您可以使用此功能:

function myMerge($arr1, $arr2) {
    // create associative array keyed by class
    foreach (array_merge($arr1, $arr2) as $pair) {
        $class[$pair['Class']][] = $pair['Student'][0];
    }
    // convert that associative array to indexed array with concatenated students string.
    foreach($class as $name => $students) {
        $result[] = ['Class' => $name, 'Student' => [implode(', ', $students)]];
    }
    return $result;
}

查看它在 eval.in

上运行

0
投票

这是另一个用户定义的函数,您可以尝试 -

function finalArray($array1, $array2){
  $finalArray = []; #Final Array
  foreach ($array1 as $key1 => $value) {
    $finalArray[$key1]['Class'] = $value['Class'];
    foreach($value['Student'] as $key2=>$class){
        $ar1 = $array1[$key1]['Student'][$key2]; #Getting every Student Array Index from First Array
        $ar2 = $array2[$key1]['Student'][$key2]; #Getting every Student Array Index from Second Array
        $ar1 = explode(', ', $ar1);    #String to Array
        $ar2 = explode(', ', $ar2);    #String to Array
        $ar3 = array_merge($ar1,$ar2); #Merge Both Array
        $ar3 = array_unique($ar3);     #Getting Unique Array Index from Both Of Them
        $ar3 = implode(', ', $ar3);    #Array To String
        $finalArray[$key1]['Student'][$key2] = $ar3; #Put in FinalArray
    }
  }

  return $finalArray;  #Return final Array
}

$finalArray = finalArray($arr1,$arr2);

注意:以上函数对于相等的

[Student]
索引数组

可以正常工作

输出:

Array(
   [0] => Array(
        [Class] => Class 1
        [Student] => Array
            (
                [0] => Name one, Name two, Name three
            )
    )
   [1] => Array(
        [Class] => Class 2
        [Student] => Array
            (
                [0] => Name one, Name Two, Name Three, Name Four
            )
    )
)

0
投票

迭代第一个数组以创建引用并将其推送到结果数组中。然后迭代第二个数组,并将 Student 值附加到预先存在的引用中,或者只是将新的 Class 行推入结果数组中。此代码片段通过

Class
列值关联行,而不是像 @hassan 的答案中那样通过行位置/索引关联行。

代码:(演示

foreach ($arr1 as $row) {
    $ref[$row['Class']] = $row;
    $result[] =& $ref[$row['Class']];
}

foreach ($arr2 as $row) {
    if (!isset($ref[$row['Class']])) {
        $result[] = $row;
    } else {
        $ref[$row['Class']]['Student'][0] .= ", {$row['Student'][0]}";
    }
}
var_export($result);

输出:

array (
  0 => 
  array (
    'Class' => 'Class 1',
    'Student' => 
    array (
      0 => 'Name one, Name two, Name three',
    ),
  ),
  1 => 
  array (
    'Class' => 'Class 2',
    'Student' => 
    array (
      0 => 'Name one, Name Two, Name Three, Name Four',
    ),
  ),
)
© www.soinside.com 2019 - 2024. All rights reserved.