Группировка пересечений массивов

У меня есть неопределенное количество текстов, которые нужно перевести на разные языки,
например $ text1 необходимо перевести на французский и венгерский.

$text1 = array ('fr', 'hr');
$text2 = array ('bg', 'el', 'hr');
$text3 = array ('bg', 'el', 'en', 'es');
$text4 = array ('bg', 'el', 'en', 'es');
$text5 = array ('bg', 'el', 'en', 'es', 'fr', 'hr');

Сейчас я ищу способ комбинировать тексты и языки, чтобы получить минимум языковых комбинаций, чтобы получить что-то вроде этого:

$order1 = array('languages' => array('bg', 'el'), 'texts' => array ('text2', 'text3', 'text4', 'text5'));
$order2 = array('languages' => array('en', 'es'), 'texts' => array ('text3', 'text4', 'text5'));
$order3 = array('languages' => array('hr'),       'texts' => array ('text1', 'text2', 'text5'));
$order4 = array('languages' => array('fr'),       'texts' => array ('text1', 'text5'));

Я совершенно не знаю, с чего начать. Кто-нибудь может мне намекнуть? Большое спасибо.

Вы задали действительно сложный вопрос! Пытаюсь сделать это ...

Mobin F.R.G 19.07.2018 14:46

Можем ли мы добавить имя переменной в конец каждого массива, чтобы упростить код? Например: $text1 = array ('fr', 'hr','text1');

Mobin F.R.G 19.07.2018 14:48

Да, это не проблема. Спасибо за вашу помощь! :-)

ondrums 19.07.2018 14:56

Я не уверен, так ли сложен этот вопрос или мне не хватает важных простых замечаний в PHP! Я попробую решить эту проблему даже днями! Но будет здорово, если кто-нибудь придет и даст короткий хороший ответ!

Mobin F.R.G 19.07.2018 16:01
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
4
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

-> Ссылка на полный код 3v4l.org <-

Вам нужно время, чтобы проверить все позиции массива

while($aux< count($order1)

И вам также понадобится $ containPrev1, который станет ложным, если $ text не содержит всех «языков» в $ order1.

Вы используете функцию in_array, чтобы проверить, находится ли ваш элемент массива в $ text. Вы проверите все элементы, потому что вы находитесь в цикле времени.

in_array($order1[$aux], $text1)

Если его нет в массиве, вы устанавливаете для $ containPrev1 значение false, чтобы указать, что хотя бы один из элементов $ order1 не находится в $ text1, и поэтому вы проигнорируете этот $ text1 до конца.

Я добавляю элементы в строку, а затем explode () строку для создания массива, вы можете напрямую создать массив, поэтому вы должны проверить его и адаптировать код к этому (я предполагал, что вы добавили 'text1' в качестве последнего элемента множество).

$finalstr = $finalstr . $text1[$lastpos].' ';
$arrayfinal = explode(" ", $finalstr);

Код слишком сложен, и вы можете упростить повторение кода с помощью функций, использовать его как основу и улучшить.

Извините за плохой английский и отсутствие правильного текстового формата, я все еще новичок в stackoverflow

Большое спасибо за ваши усилия!

ondrums 20.07.2018 09:21
Ответ принят как подходящий

Это действительно была довольно сложная проблема.

Вот мое решение:

// first collect all texts per individual language
for( $i = 1, $data = []; ( $key = 'text' . $i++ ) && isset( ${$key} ); ) {
  $data = array_merge_recursive( $data, array_fill_keys( ${$key}, $key ) );
}

// then walk through them and find other languages that match the same texts
for( $i = 1, $orders = []; count( $data ) > 0; $i++ ) {
  $texts = reset( $data );
  $order = [ 'languages' => [], 'texts' => $texts ];
  while( false !== ( $lang = array_search( $texts, $data, true ) ) ) {
    $order[ 'languages' ][] = $lang;
    unset( $data[ $lang ] );
  }
  $orders[ 'order' . $i ] = $order;
}

view sample on eval.in


Заметки

  1. Заказы не в порядке вашего примера. Сообщите мне, если это необходимо.
  2. Если вы настаиваете на наличии отдельных переменных порядка ($order1, $order2 и т. д.) Вместо массива заказов, вы можете использовать extract( $orders );, чтобы извлечь их в текущую область видимости, но я бы посоветовал этого не делать, поскольку вы можете случайно перезаписать предварительную существующие переменные, если вы не будете осторожны.

Интересный ответ!

Mobin F.R.G 19.07.2018 17:09

Большое спасибо за Вашу помощь!

ondrums 20.07.2018 09:20

Другие вопросы по теме