在多维数组中组合内部数组-PHP
我有一个二维数组:在多维数组中组合内部数组-PHP,php,arrays,Php,Arrays,我有一个二维数组: array( array( 'Friend', 'Amigo', '', '' ), array( 'Friend', '', 'Fraund', '' ), array( 'Thanks', 'Gracias', '', '' ), array( 'Thanks', '', 'Danke', ''
array(
array(
'Friend',
'Amigo',
'',
''
),
array(
'Friend',
'',
'Fraund',
''
),
array(
'Thanks',
'Gracias',
'',
''
),
array(
'Thanks',
'',
'Danke',
''
)
);
基本上,当内部数组具有相同的值时,我需要按相应的顺序组合它们。例如,当前示例中的“朋友”和“谢谢”。输出应为:
array(
array(
'Friend',
'Amigo',
'Fraund',
''
),
array(
'Thanks',
'Gracias',
'Danke',
''
)
);
因此,空元素需要被具有某些值的对应元素覆盖。无法理解如何在php中使用array\u merge
执行此操作
array_unique($arr1,$arr2);
or
array_merge($arr1,$arr2);
但是在你的情况下,你有一个单独的数组,你必须把它分成不同的数组
$mainArary = array(
array(
'Friend',
'Amigo',
'',
''
),
array(
'Friend',
'',
'Fraund',
''
),
array(
'Thanks',
'Gracias',
'',
''
),
array(
'Thanks',
'',
'Danke',
''
)
);
$first_array = null;
$second_array = null;
$i = 0;
foreach($mainArray[0] as $arr){
if($i < 2){
if($prev_array == null){
$prev_array = $arr;
} else {
$prev_array = array_merge($prev_array,$arr);
} } else {
if($second_array == null){
$second_array = $arr;
} else {
$second_array = array_merge($second_array ,$arr);
}
}
}
print_r($prev_array);
print_r($second_array);
$mainArary=array(
数组(
“朋友”,
“朋友”,
'',
''
),
数组(
“朋友”,
'',
“夫人”,
''
),
排列(
“谢谢”,
“格雷西亚斯”,
'',
''
),
排列(
“谢谢”,
'',
“丹麦”,
''
)
);
$first_数组=null;
$second_数组=null;
$i=0;
foreach($mainArray[0]作为$arr){
如果($i<2){
if($prev_数组==null){
$prev_数组=$arr;
}否则{
$prev\u array=array\u merge($prev\u array,$arr);
}}其他{
if($second_array==null){
$second_数组=$arr;
}否则{
$second\u array=array\u merge($second\u array,$arr);
}
}
}
打印(上一个数组);
打印(第二个数组);
这是您想要的输出。好吧,我会这样做的
$final_array = array();
$original_array = array(
array(
'Friend',
'Amigo',
'',
''
),
array(
'Friend',
'',
'Fraund',
''
),
array(
'Thanks',
'Gracias',
'',
''
),
array(
'Thanks',
'',
'Danke',
''
)
);
$friends_array = array();
foreach($original_array[0] as $row) {
if($row != "") {
array_push($friends_array, $row);
}
}
foreach($original_array[1] as $row) {
if($row != "" && !in_array($row, $friends_array)) {
array_push($friends_array, $row);
}
}
$thanks_array = array();
foreach($original_array[2] as $row) {
if($row != "") {
array_push($thanks_array, $row);
}
}
foreach($original_array[3] as $row) {
if($row != "" && !in_array($row, $thanks_array)) {
array_push($thanks_array, $row);
}
}
array_push($final_array, $friends_array, $thanks_array);
你确实有一个非常具体的要求。非常奇怪的tbh。迭代数组,将值添加到新数组(由内部数组中的第一个元素索引),然后使用
数组_值
获得所需的输出(或保持索引不变,这可能有利于进一步的数据访问):
现场工作示例:
您可以这样使用:
$result = array_values(array_reduce($a, function(array &$final, $current) {
$key = $current[0];
if (isset($final[$key])) {
// replace items that are not an empty string
$final[$key] = array_replace($final[$key], array_filter($current, 'strlen'));
} else {
$final[$key] = $current;
}
return $final;
}, []));
reduce操作创建一个数组,其中每个数组的第一个字用作键<如果字符串不为空,则代码>数组_replace()将用新值更新现有值
然后,通过
array\u values()
提取最终结果,以除去reduce操作期间使用的临时键。顺序重要吗?如中所述,['Friend',''Amigo','Fraund']
可以吗?@Ja͢ck,是的,它有各自的语言顺序:英语、西班牙语、德语,例如意大利语。谢谢史蒂夫。它完成了一半的工作。但是你的产出和我预期的不一样。首先,它删除所有内部数组中应该保留的最后一个空元素。其次,顺序非常重要。它应该保持与示例中相同的顺序。谢谢,杰克。又好又简单。我遇到的唯一问题是,当我循环遍历数组并将其放入.csv格式的文件时,它会带来我以前没有遇到的Unicode问题。例如,一些西班牙语字母或俄语字母看起来很糟糕。我知道这与当前的问题无关,但对于这方面的任何帮助,我都会说谢谢@KananFarzali是的,这不应该和这个答案有关;你可能想看看你可能错过了什么。
$result = array_values(array_reduce($a, function(array &$final, $current) {
$key = $current[0];
if (isset($final[$key])) {
// replace items that are not an empty string
$final[$key] = array_replace($final[$key], array_filter($current, 'strlen'));
} else {
$final[$key] = $current;
}
return $final;
}, []));