Intereting Posts
Заполните поле формы joomla читать содержимое внешней веб-страницы и получать конкретные элементы Проверка подлинности PHP is_numeric или preg_match 0-9 CakePHP: Нет такого файла или каталога (попытка подключения через unix: ///var/mysql/mysql.sock) PHP к серийному со странными скоростями в бодах Проверьте URL-адрес перед перенаправлением symfony2 Перцептивные алгоритмы хеширования в Python или PHP? JW Player читается с php Есть быстрый способ добавить префиксы ко всем классам CSS и идентификаторам? PHP-парсер PHP, который позволяет мне делать выбор класса и получать родительские узлы Сжатие строки gzip Как указать, что ожидается, что тест PHPUnit завершится неудачей? Как получить доступ к параметрам Guzzle QueryString в веб-чатах Ratchet? Использование активного каталога для аутентификации пользователей на сайте интрасети php / mysql: Как вставить строку gzcompress-ed в текстовое поле mysql?

PHP: объединение смежных значений, если дубликаты найдены в многомерном массиве

У меня есть несколько наборов переменных 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] соответственно.

Мне интересно, как это сделать.

Solutions Collecting From Web of "PHP: объединение смежных значений, если дубликаты найдены в многомерном массиве"

Вот настоящая рабочая лошадка:

Начиная с $font_f это будет:

  1. Объедините значения lang и weight на дублированных шрифтах в каждом подмассиве.
  2. Удалите повторяющиеся значения в строках CSV и весов CSV.
  3. Сортировка ASC уникальных значений языка и веса.
  4. Сортируйте подмассивы по их имени / имени шрифта.
  5. Замените ключи ассоциативного подмассива с числовыми индексами.

Вот код:

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