2014-11-17 4 views
1

У меня есть двумерный массив:Объединить внутренние массивы в многомерном массиве - PHP

array(
    array( 
    'Friend', 
    'Amigo', 
    '', 
    '' 
    ), 

    array( 
    'Friend', 
    '', 
    'Fraund', 
    '' 
    ), 

    array(
    'Thanks', 
    'Gracias', 
    '', 
    '' 
    ), 

    array(
    'Thanks', 
    '', 
    'Danke', 
    '' 
    ) 
); 

В принципе, мне нужно, чтобы объединить внутренние массивы, когда они имеют одинаковые значения в соответствующем порядке. Например, «друг» и «спасибо» в текущем примере. Выход должен быть:

array(
    array( 
    'Friend', 
    'Amigo', 
    'Fraund', 
    '' 
    ), 

    array(
    'Thanks', 
    'Gracias', 
    'Danke', 
    '' 
    ) 
); 

Таким образом, пустой элемент должен быть перезаписан соответствующим элементом, который получил некоторое значение. Не могу понять, как это сделать с помощью array_merge.

+0

Имеет ли значение вопрос? Как в, '['Friend', '', 'Amigo', 'Fraund']' в порядке? –

+0

@ Ja͢ck, да, это соответствует соответствующему языковому порядку: английский, испанский, немецкий и, например, итальянский. –

ответ

1

Вы можете использовать array_reduce() так:

$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; 
}, [])); 

Операция уменьшения создает массив, в котором в качестве ключа используется первое слово каждого массива; array_replace() обновляет существующие значения новыми, если строка не пустая.

Конечный результат затем вытягивается через array_values(), чтобы избавиться от временных ключей, которые использовались во время операции уменьшения.

+0

Спасибо, Джек. Ницца и просто. Единственная проблема, которую я получаю, - это когда я просматриваю массив и помещаю его в файл формата .csv, он вызывает проблемы Unicode, которых у меня раньше не было. Например, некоторые испанские буквы или русские буквы выглядят ужасно. Я знаю, что это не имеет никакого отношения к текущему вопросу, но за любую помощь в этом я бы сказал Спасибо! –

+1

@ KananFarzali Да, это не должно быть связано с этим ответом; вы можете посмотреть [этот вопрос] (http://stackoverflow.com/questions/279170/utf-8-all-the-way-through), чтобы узнать, что вы, возможно, пропустили. –

0

в PHP вы можете использовать

array_unique($arr1,$arr2); 
or 
array_merge($arr1,$arr2); 

Но в вашем состоянии вы ahve один массив, который вы должны разделить на разные массивы

$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); 

Вот ваш желаемый результат.

0

Ну, я бы об этом как этот

$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.

1

Итерируйте массив, добавьте значения в новый массив (проиндексированный 1-м элементом во внутренних массивах), затем используйте array_values для получения желаемого результата (или оставьте его проиндексированным как есть, что может быть полезно для дальнейших данных доступа):

$out = []; 
foreach ($input as $val) { 
    $key = $val[0]; 
    foreach ($val as $item) { 
     if(!empty($item) && $item !=$key){ 
      $out[$key][]=$item; 
     } 
    } 
    if(!in_array($key, $out[$key])) $out[$key][]=$key; 
} 
$out = array_values($out); 
var_dump($out); 

Живой рабочий пример: http://codepad.viper-7.com/EoRhh2

+0

Спасибо Стив. Это делает половину работы. Но ваш результат не тот, который я ожидаю. Во-первых, он удаляет последние пустые элементы всех внутренних массивов, которые должны оставаться. Во-вторых, порядок очень важен. Он должен оставаться в том же порядке, что и в примере. –

Смежные вопросы