在多维数组中组合内部数组-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;
}, []));