这是两个相似的数组,我想按请求的方式加入这个数组。我怎样才能做到这一点。
$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')
),
);
两个数组包含相同的行数和相同的列,但列值不同。
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 )
)
)
正如 @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 )
)
)
您可以使用此功能:
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
上运行这是另一个用户定义的函数,您可以尝试 -
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
)
)
)
迭代第一个数组以创建引用并将其推送到结果数组中。然后迭代第二个数组,并将 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',
),
),
)