0

関係のある航空会社を単一のチェーンにグループ化しようとしています。

Array
(
    [0] => Array
        (
            [0] => Aeroflot
            [1] => S7
            [2] => Transaero
        )

    [1] => Array
        (
            [0] => Alitalia
            [1] => Lufthansa
        )

    [2] => Array
        (
            [0] => Transaero
            [1] => United
        )

    [3] => Array
        (
            [0] => United
            [1] => Alitalia
        )

    [4] => Array
        (
            [0] => Volotea
            [1] => Iberia
        )

    [5] => Array
        (
            [0] => Transaero
            [1] => Aeroflot
        )

)

その配列から、要素間の接続を見つけてグループに結合する必要があります。予想された結果:

Array
(
    [0] => Array
        (
            [0] => Aeroflot
            [1] => S7
            [2] => Transaero
            [3] => United
            [4] => Alitalia
            [5] => Lufthansa
        )

    [1] => Array
        (
            [0] => Volotea
            [1] => Iberia
        )

)

誰でもそれを手伝ってもらえますか?私は十数の方法を試しましたが、まだ成功していません。

私が試した最も近い方法は機能しますが、すべての場合ではありません:

    function array_searchRecursive($needle,$haystack) {
        foreach($haystack as $key=>$value) {
            $current_key=$key;
            if($needle===$value OR (is_array($value) && array_searchRecursive($needle,$value) !== false)) {
                return $current_key;
            }
        }
        return false;
    }   

foreach ($newarr as $key => $airlines)
    {
        foreach ($airlines as $lastkey => $airline)
        {
        $index = array_searchRecursive($airline,$newarr);   
        echo $airline.$index."\n";
        if ($index !== false)
        {
            $newarr[$index] = array_merge($newarr[$index],$airlines);
            $lastarr[] = $index;
        }

        }
    }

ただし、配列内のすべての値と一致するわけではありません。

4

3 に答える 3

0
   $arr = [
      ['Aeroflot', 'S7', 'Transaero'],
      ['Alitalia', 'Lufthansa'],
      ['Transaero', 'United'],
      ['United', 'Alitalia'],
      ['Volotea', 'Iberia'],
      ['Transaero', 'Aeroflot']
     ];
  $hash = [];
  $result = [];
  foreach($arr as $set){
    foreach($set as $el){
      if(!$hash[$el]) $hash[$el] = [] ;
      $hash[$el] = array_merge($hash[$el], $set);
    }
  }
  function merge_connections(&$h, $key){    
    if(!$h[$key]) return [];
    $data = [$key];
    $rels = $h[$key];
    unset($h[$key]);
    foreach($rels as $rel){
      if($rel==$key) continue;
      $data = array_merge($data, merge_connections($h, $rel));
    }    
    return $data;
  }
  foreach(array_keys($hash) as $company){   
   if(!$hash[$company]) continue;   
   array_push($result, merge_connections($hash, $company));
  }
  print_r($result);
于 2013-11-15T12:19:09.100 に答える
0

あなたの例によると、最初のサブ配列を参照として使用してサブ配列をグループ化しているだけです。たとえば、最初のサブ配列と後続のサブ配列に共通の要素がある場合、それらを 1 つのサブ配列に結合します。

<?php

$arr = array(
array('a', 'b', 'c', 'd'),
array('d', 't'),
array('t', 'f'),
array('k', 'o'),
array('p', 'z')
);
$arr_implode = array();

foreach ($arr as $key => $value) {
 if (is_array($value)) {
$arr_implode[$key] = implode('', $value);
} else {
$arr_implode[$key] = $value;
}
}

$arr_key = array();
$result = array();
$count = count($arr_implode);
$tempj = 0;
for ($i = 0; $i <= $count; $i++) {
  $flag = FALSE;
  for ($j = ($i + 1); $j < $count; $j++) {
  similar_text($arr_implode[$i], $arr_implode[$j], $percent);
   if ($percent > 0) {
    $result[] = array_merge($arr[$i],$arr[$j]);
    break;
  } else {
    $result[] = $arr[$j];
    break;
 }
}

}
foreach($result as $key => $val){
  $result[$key] = array_unique($val);
}
echo "<pre>";
print_r($result);
echo "</pre>";
?>

このコードを試してください。

于 2013-11-15T04:05:33.540 に答える
0

再帰関数が役立ちます。どういたしまして )

$arr = array(
    array('Aeroflot','S7','Transaero'),
    array('Alitalia','Lufthansa'),
    array('Transaero','United'),
    array('United','Alitalia'),
    array('Volotea','Iberia'),
    array('Transaero','Aeroflot')
);

function getConnections($arr,$curr_line_n=0,$num=0) {
    for($i=0;$i<count($arr[$curr_line_n]);$i++) {
        $cur_air_name = $arr[$curr_line_n][$i];

        for($k=$curr_line_n+1; $k<count($arr); $k++) {

            for($l=0;$l<count($arr[$k]);$l++) {

                if ($arr[$k][$l]==$cur_air_name) {
                    $arr[$curr_line_n] = array_values(array_unique(array_merge($arr[$curr_line_n],$arr[$k])));
                    array_splice($arr,$k,1);
                    $num++;
                    $arr = getConnections($arr,$curr_line_n,$num);

                }
            }
        }
    }
    $num++;
    $curr_line_n++;
    if ($curr_line_n!=count($arr)) {
        $arr = getConnections($arr,$curr_line_n,$num);
    }


    return $arr;
}
print_r(getConnections($arr));
于 2013-11-15T11:36:29.533 に答える