У меня есть неопределенное количество текстов, которые нужно перевести на разные языки,
например $ 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'));
Я совершенно не знаю, с чего начать. Кто-нибудь может мне намекнуть? Большое спасибо.
Можем ли мы добавить имя переменной в конец каждого массива, чтобы упростить код? Например: $text1 = array ('fr', 'hr','text1');
Да, это не проблема. Спасибо за вашу помощь! :-)
Я не уверен, так ли сложен этот вопрос или мне не хватает важных простых замечаний в PHP! Я попробую решить эту проблему даже днями! Но будет здорово, если кто-нибудь придет и даст короткий хороший ответ!






-> Ссылка на полный код 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
Большое спасибо за ваши усилия!
Это действительно была довольно сложная проблема.
Вот мое решение:
// 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;
}
Заметки
$order1, $order2 и т. д.) Вместо массива заказов, вы можете использовать extract( $orders );, чтобы извлечь их в текущую область видимости, но я бы посоветовал этого не делать, поскольку вы можете случайно перезаписать предварительную существующие переменные, если вы не будете осторожны.Интересный ответ!
Большое спасибо за Вашу помощь!
Вы задали действительно сложный вопрос! Пытаюсь сделать это ...