在PHP中对文本文件中的列表重新排序

时间:2016-05-05 15:45:00

标签: php arrays sorting

大家。第一个问题,所以在这个菜鸟上放轻松。 ;)

无论如何,真的难倒了。我有一个带有这种列表的文本文件:

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行匹配,依此类推。我可以将线条分解成单独的数组,但在那之后我就把它打倒了。我将如何获取这些数组并以某种方式对其进行排序以使其看起来像最终版本?

感谢您提供所有信息!

更新:

我到目前为止的代码:

var blocks = $(".blocks");
for(var i = 0, len < blocks.length; i++) {
      var val = $(blocks[i]).text();
      ...
});

产生:

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

现在我不在乎他们不是新行。这一点并不重要。现在,我需要弄清楚如何使它排序并显示为第二个代码块。这就是困扰我的部分。

希望这有助于清理事情。

4 个答案:

答案 0 :(得分:0)

嗯,你有点尝试,我很无聊:

//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));

答案 1 :(得分:0)

你可以逐行使用fgets读取,并将行分解为数组。那就是你有一个像这样的数组:

$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);

最后,您可以使用implode将每个子数组输出为一行。

答案 2 :(得分: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

答案 3 :(得分: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 ) );