我想合并数组的顶层,以便共享同一父级的第二层的所有值都与该父级形成单个数组。
数组1:
Array
(
[0] => Array
(
[0] => C1
[1] => C1
[2] => C1
[3] => AC
[4] => AC
)
)
数组2:
Array
(
[0] => Array
(
[0] => C1_complete
[1] => C1_29-95
[2] => C1_49-95
[3] => AC_complete
[4] => AC_29-95
)
)
所需结果:
Array
(
[0] => Array
(
'C1' => Array (C1_complete, C1_29-95, C1_49-95),
'AC' => Array (AC_complete, AC_29-95)
)
)
实现这一目标的简单,优雅的方法是什么?
我寻求一种可以将相同原理推广到任何两级数组结构的解决方案。
答案 0 :(得分:0)
如果我仅使用数组2和一个简单的foreach
循环,则可以这样做:
$array2 = [['C1_complete',
'C1_29-95',
'C1_49-95',
'AC_complete',
'AC_29-95']];
$buffer = [];
foreach ($array2[0] as $value) {
$buffer[substr($value, 0, 2)][] = $value;
}
$result[] = $buffer;
echo '<pre>';
print_r($result);
echo '</pre>';
输出为:
Array
(
[0] => Array
(
[C1] => Array
(
[0] => C1_complete
[1] => C1_29-95
[2] => C1_49-95
)
[AC] => Array
(
[0] => AC_complete
[1] => AC_29-95
)
)
)
如果该代码在函数中,那就太好了
function classify($array)
{
$result = [];
foreach ($array[0] as $value) {
$result[substr($value, 0, 2)][] = $value;
}
return [$result];
}
$array2 = [['C1_complete',
'C1_29-95',
'C1_49-95',
'AC_complete',
'AC_29-95']];
echo '<pre>';
print_r(classify($array2));
echo '</pre>';
输出保持不变。
答案 1 :(得分:0)
对于数组,您不需要第一个循环,但是如果您的数组中有多个数组。只需循环并grep以键开头的项目即可:
foreach($array1 as $key => $inner) {
foreach($inner as $k) {
$result[$key][$k] = preg_grep("/^$k/", $array2[0]);
}
}
使用给定的数组:
foreach($array1[0] as $k) {
$result[0][$k] = preg_grep("/^$k/", $array2[0]);
}
答案 2 :(得分:0)
好吧,在这种情况下,simple
和elegant
的方式在我看来都不太可能,因为这可能是基于观点的。简单的foreach是实现此目的的最简单,最有效的方法。但是,为了优雅起见,您可以使用array_walk,array_fill和array_combine来实现。
<?php
$arr1 = Array(
Array
(
'C1',
'C1',
'C1',
'AC',
'AC'
)
);
$arr2 = Array(
Array(
'C1_complete',
'C1_29-95',
'C1_49-95',
'AC_complete',
'AC_29-95'
)
);
$data = array_combine(array_values($arr1[0]),array_fill(0,count($arr1[0]),[]));
array_walk($arr2[0],function($value) use (&$data){
if(isset($data[explode("_",$value)[0]])) $data[explode("_",$value)[0]][] = $value;
});
$data = [$data]; // since you want it inside another array.
print_r($data);