У меня есть несколько наборов переменных PHP, из которых я создаю многомерный массив. Теперь в этом массиве я хочу проверить конкретный ключ ( [font]
) для дубликатов.
Если найдены дубликаты, соответствующие и соответствующие значения для [lang]
и [weight]
должны сливаться.
Вот что я пробовал до сих пор (это unsets / удаляет дублирующее значение из массива):
// 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 "<pre>"; 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);
с// 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 "<pre>"; 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);
Выход :
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 ) )
Как вы можете видеть в приведенном выше коде, Font [1] и Font [3] будут иметь одинаковое значение для [font]
ie Lora, поэтому [lang]
и [weight]
для Font [1] должны сливаться с [lang]
и [weight]
для шрифта [3] соответственно.
Мне интересно, как это сделать.
Начиная с $font_f
это будет:
Вот код:
$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 "<pre>"; print_r($array); echo "</pre>";
Вывод:
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 ) )
Вместо цикла for я бы лично сделал что-то вроде:
$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; } }