2016-05-05 8 views
-1

everyone。非常に最初の質問ですので、このnoobで簡単に取る。 ;)リストをPHPのテキストファイルで再ソート

とにかく、本当に何かに困惑しました。私は、リストのこの種のテキストファイルを持っている:

1: A C D 
4: A B 
5: D F 
7: A E 
9: B C 

の目標は、このリスト何とかするために再ソートであり、このように表示されています:

 
A: 1 4 7 
B: 4 9 
C: 1 9 
D: 1 5 
E: 7 
F: 5 

トリックが一致すると表示されます一致した値。たとえば、「A」は1,4および7などと一致します。私は個々の配列に線を爆発させることができますが、それ以降は私に悩まされます。どのように私はそれらの配列を取って、何とか最終版のように見えるようにそれらを並べ替えるつもりですか?

ありがとうございました!

UPDATE:私はこれまで持って

コード:

<?php 
$string="1: A C D 
4: A B 
5: D F 
7: A E 
9: B C"; 
$lines = explode("\n", $string); 
sort($lines); 
foreach($lines as $line){ 
echo $line."<br>"; 
} 

// start with this 
//1: A C D 
//4: A B 
//5: D F 
//7: A E 
//9: B C 

// resort and display as this 
//A: 1 4 7 
//B: 4 9 
//C: 1 9 
//D: 1 5 
//E: 7 
//F: 5 
?> 

生成:今

 
1: A C D 
4: A B 
5: D F 
7: A E 
9: B C 

私は、彼らが新しい行に含まれていないことを気にしません。現時点では重要ではありません。今は、ソートして2番目のコードブロックとして表示する方法を理解する必要があります。それが私を困惑させる部分です。

希望をクリアするのに役立ちます。

+0

はより良いあなたが行うことがしたいのかを説明します。あなたはAが1,4,7行と一致していると言っていましたが、何らかの理由で1がAになり、新しいテキストファイルに余分な行が含まれていました。あなたはAの2つを1に置き換え、 Aさんと4人です。あなたが何をしたいのかわからない場合、質問に答えるのを手助けすることはできません。 – Webeng

+2

例はかなり自明です –

+0

申し訳ありませんが、本当に複雑な要求です。最初のブロックでは、1にA、C、Dの3つの文字があります.2にはAとBなどがあります。 "A"の行がかなりカウントされ、2番目のコードブロックのように表示されます。したがって、たとえば、 "A"は行1,4、および7に現れますが、何らかの理由でスペースを使用して区切られています。どんな混乱も解消することを願っています。 – syntonik

答えて

0

さて、あなたは一種のそれを試してみました、私は退屈していた:あなたが行ずつ読み込む関数fgetsを使用して、配列に行を爆発することができます

//read file into array of lines 
$lines = file('/path/to/file.txt', FILE_IGNORE_NEW_LINES); 

//loop through the lines 
foreach($lines as $line) { 
    //explode on space 
    $cols = explode(' ', $line); 
    //loop through columns and build array with letter as key adding number to that array 
    for($i=1; $i < count($cols); $i++) { 
     $result[$cols[$i]][] = trim($cols[0], ':'); 
    } 
} 
//sort by key (or sort $output later) 
ksort($result); 

//loop through and build new lines 
foreach($result as $key => $vals) { 
    $output[] = "{$key}: " . implode(' ', $vals); 
} 
//write lines to file 
file_put_contents('/path/to/file.txt', implode("\n", $output)); 
+0

これは、私が展開するのに良いポイントになった。これは私が必要と思っていたよりもはるかに多くのコードでしたが、うまくいきます。ありがとうございました! – syntonik

0

。そして、変換し、それを並べ替える

$arr = array(
     1 =>['A', 'C', 'D'], 
     4 => ['A', 'B'], 
     5 => ['D', 'F'], 
     7 => ['A', 'E'], 
     9 => ['B', 'C'] 
    ); 

$converted = []; 

foreach ($arr as $ind => $a) { 
    foreach ($a as $e) { 
     if (isset($converted[$e])) { 
     $converted[$e][] = $ind; 
     } else { 
     $converted[$e] = array($ind); 
     } 
    } 
} 

ksort($converted); 

最後に、あなたが出力するラインとして、各サブアレイを内破使用することができ、それはあなたのような配列を持っています。

0

これは私がやったことです:

$lines = " 
1: A C D 
4: A B 
5: D F 
7: A E 
9: B C 
"; 

$first_array = explode("\n", $lines); 
$new_order_key = array(); 
foreach ($first_array as $key =>$val) { 
    $tmp_array = explode (' ',$val); 
    $key = str_replace(':', '', $tmp_array[0]); 
    unset($tmp_array[0]); //remove the first line break 
    $new_array[$key] = $tmp_array; 
    $new_order_key = array_unique(array_merge($tmp_array, $new_order_key)); 
} 
$new_array = array_filter($new_array); 
$final_array = array(); 
foreach($new_order_key as $key=>$val) { 
    foreach($new_array as $tmp_array_key => $temp_array_val) { 
     foreach ($temp_array_val as $v) { 
      if($val == $v) { 
       $final_array[$val][] = $tmp_array_key; 
      } 
     } 
    } 
} 
ksort($final_array); 

foreach($final_array as $key=>$val) { 
    echo $key.': '.implode(' ',$val).'<br />'; 
} 

そして、私はこの出力を得た:

A: 1 4 7 
B: 4 9 
C: 1 9 
D: 1 5 
E: 7 
F: 5 
0

別の実装:

<?php 
$handle = fopen("input.txt", "r"); 
while (($line = fgets($handle)) !== false) { 
    list($index, $letters) = explode(": ", $line); 
    $letters = explode(" ", $letters); 
    foreach ($letters as $letter) { 
     $group[ $letter ][] = $index; 
    } 
} 
ksort($group); 
foreach ($group as $key => $values) { 
    $output[] = $key . ": " . implode(" ", $values); 
} 
file_put_contents("output.txt", implode("\n", $output)); 
関連する問題