分组交集

时间:2018-07-19 12:32:49

标签: php

我的文本不确定,需要翻译成不同的语言,
例如$ 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'));

我绝对不知道如何开始。有人可以给我一个提示吗? 非常感谢。

2 个答案:

答案 0 :(得分:2)

这确实是一个非常棘手的问题。

这是我的解决方法:

// 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等),而不是orders数组,可以执行extract( $orders );将其提取到当前范围中,但我建议不要这样做,因为如果您不小心的话,可能会意外覆盖先前存在的变量。

答案 1 :(得分:1)

-->Link for 3v4l.org full code<--

您必须花一点时间检查所有阵列位置

while($aux< count($order1)

您还需要一个$ containPrev1,如果$ text的$ order1中没有所有的“语言”,它将变为false。

使用函数“ in_array”检查数组元素是否在$ text中。您将检查所有可能导致出现提示的元素。

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

如果它不在数组中,则将$ containPrev1设置为false,以指出$ order1的至少一个元素不在$ text1中,因此您会在其余时间内忽略$ text1。

我将元素添加到字符串中,然后将字符串explode()创建一个数组,您可以直接创建一个数组,因此您应该检查它并对其进行修改(我假设您在最后添加了'text1')数组的元素)。

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

代码过于复杂,您可以使用函数简化代码重复,将其用作基础并加以改进。

对不起,英语不好,而且缺少正确的文本格式,我仍然对stackoverflow还是陌生的