PHP: mesclando valores adjacentes se duplicados encontrados em uma multidimensional array

Eu tenho alguns conjuntos de variables ​​PHP a partir dos quais eu estou fazendo uma multidimensional array. Agora, naquela matriz, eu quero verificar uma chave particular ( [font] ) para duplicatas.

Se as duplicatas encontradas, os valores correspondentes e respectivos para [lang] e [weight] devem ser mesclados.

Aqui está o que eu tentei até agora (isso não recupera / remove o valor duplicado da matriz):

 // Font [0] $font_1 = "Poppins"; $font_1_l = "Hindi, English"; $font_1_w = "700, 700i"; // Font [1] $font_2 = "Lora"; $font_2_l = "Vietnamese, Japanese"; $font_2_w = "200, 300, 400, 400i"; // Font [2] $font_3 = "Noto Sans"; $font_3_l = "Punjabi, Latin, Hindi"; $font_3_w = "200, 200i, 300, 300i, 400, 500"; // Font [3] $font_4 = "Lora"; $font_4_l = "Greek, Roman, Vietnamese"; $font_4_w = "400, 400i, 500, 500b"; // Array of all the values $font_f = array( array( 'font' => $font_1, 'lang' => $font_1_l, 'weight' => $font_1_w ), array( 'font' => $font_2, 'lang' => $font_2_l, 'weight' => $font_2_w ), array( 'font' => $font_3, 'lang' => $font_3_l, 'weight' => $font_3_w ), array( 'font' => $font_4, 'lang' => $font_4_l, 'weight' => $font_4_w ) ); // Printing the array for testing echo "
"; print_r( array_map("unserialize", array_unique(array_map("serialize", $font_f))) ); // Removing duplicates $font_f_copy = $font_f; // Copy of $font_f for modification $fonts = array(); // To get unique fonts for( $i=0; $i<count($font_f); $i++ ) { if ( in_array( $font_f[$i]['font'], $fonts ) ) { unset($font_f_copy[$i]); } else { $fonts[] = $font_f[$i]['font']; } } // Printing $font_f_copy for testing print_r($font_f_copy); 

Saída :

 Array ( [0] => Array ( [font] => Poppins [lang] => Hindi, English [weight] => 700, 700i ) [1] => Array ( [font] => Lora [lang] => Vietnamese, Japanese [weight] => 200, 300, 400, 400i ) [2] => Array ( [font] => Noto Sans [lang] => Punjabi, Latin, Hindi [weight] => 200, 200i, 300, 300i, 400, 500 ) [3] => Array ( [font] => Lora [lang] => Greek, Roman, Vietnamese [weight] => 400, 400i, 500, 500b ) ) Array ( [0] => Array ( [font] => Poppins [lang] => Hindi, English [weight] => 700, 700i ) [1] => Array ( [font] => Lora [lang] => Vietnamese, Japanese [weight] => 200, 300, 400, 400i ) [2] => Array ( [font] => Noto Sans [lang] => Punjabi, Latin, Hindi [weight] => 200, 200i, 300, 300i, 400, 500 ) ) 

Como você pode ver no código acima, Font [1] e Font [3] terão o mesmo valor para [font] ou seja, Lora, então os [lang] e [weight] for Font [1] devem se fundir com [lang] e [weight] para Font [3], respectivamente.

Eu me pergunto como proceder para conseguir isso.

Aqui está um verdadeiro cavalo de batalha:

A partir de $font_f isso irá:

  1. Concatenate lang e valores de peso em fonts duplicadas em cada subarray.
  2. Remova os valores duplicados nas cordas CSV de linguagem e peso.
  3. Classifique ASC os valores exclusivos de linguagem e peso.
  4. Classifique os subarritas por seu nome de chave / fonte.
  5. Substitua as chaves do subarray associativo por índices numéricos.

Aqui está o código:

 $array=[]; foreach($font_f as $a){ $array[$a["font"]]["font"]=$a["font"]; // declare or lazy overwrite if duplicate foreach(array("lang","weight") as $col){ // cycle through the concat-able elements if(isset($array[$a["font"]][$col])){ $temp_str=$array[$a["font"]][$col].", ".$a[$col]; // concat }else{ $temp_str=$a[$col]; // declare } $temp_arr=array_unique(explode(', ',$temp_str)); // split & remove duplicates sort($temp_arr); // sort $array[$a["font"]][$col]=implode(', ',$temp_arr); // rejoin } } ksort($array); // sort subarrays by font name $array=array_values($array); // replace temporary associative keys with indices echo "
"; print_r($array); echo "

";

Saída:

 Array( [0] => Array( [font] => Lora [lang] => Greek, Japanese, Roman, Vietnamese [weight] => 200, 300, 400, 400i, 500, 500b ), [1] => Array( [font] => Noto Sans [lang] => Hindi, Latin, Punjabi [weight] => 200, 200i, 300, 300i, 400, 500 ), [2] => Array( [font] => Poppins [lang] => English, Hindi [weight] => 700, 700i ) ) 

Em vez do loop for, eu pessoalmente faria algo como:

 $result = []; foreach ($font_f as $f) { if (isset($result[$f["font"]])) { $result[$f["font"]] = [ "font" => $f["font"], "lang" => $f["lang"]." ,".$result[$f["font"]]["lang"], "weight" => $f["weight"]." ,".$result[$f["font"]]["weight"] ]; } else { $result[$f["font"]] = $f; } }