从文本文件读取并从中提取特定数据,然后对其进行排序

时间:2018-07-08 11:05:49

标签: php arrays

我已经尝试这样做了好几个星期,而我一直在寻找和尝试许多不同的方式来解决先前提出的问题。

我有一个文本(txt)文件,其中包含有关以下人员的数据: ID:NAME.SURNAME:AGE

1:hannah.smith:20:
2:bob.jones:40:
3:james.williams:19:
4:ben.higgins:25:
100:andrew.ross:70:
....

该文件具有大约150行这种格式的名称。

我想做的是从文件中读取并分隔每个“字段”,因此它们都是单独的(ID,NAME,SURNAME,AGE)。我想按名字的字母顺序对数据进行排序。所以:

100:andrew.ross:70:
4:ben.higgins:25:    
2:bob.jones:40:
1:hannah.smith:20:
3:james.williams:19:
....

我尝试使用一些php的CSV文件,但最终却出现了许多嵌套数组。我试过了,这有点用,但是我不知道如何排序。如果有更好的方法来完成所有这些工作,那么我将不胜感激。但是到目前为止,我已经阅读了该文件,但是不确定如何按照字母顺序对其进行排序,或者可能将每个字段都放在一个排序的数组中?

到目前为止,这里有我的代码:

$file = 
file_get_contents("/file_path", 0, 
NULL, 148);
        array_shift($rows);
            foreach($rows as $row => $data)
            {
                //get row data
                $row_data = explode(':', $data);

                $info[$row]['id']           = $row_data[0];
                $info[$row]['name']         = $row_data[1];
                $info[$row]['surname']  = $row_data[2];
                $info[$row]['age']       = $row_data[3];

                //display data
                echo 'Row ' . $row . ' ID: ' . $info[$row]['id'] . "\n";
                echo 'Row ' . $row . ' First Name: ' . $info[$row]['name'] . "\n";
                echo 'Row ' . $row . ' Last Name: ' . $info[$row]['surname'] . "\n";
                echo 'Row ' . $row . ' Age: ' . $info[$row]['age'] . "\n";
            }

3 个答案:

答案 0 :(得分:1)

似乎您已经使它复杂化了,您真正需要做的就是将文件按行分割(file()已经这样做了),然后用:字符explode()每行,将结果压入数组,然后对结果进行数组排序,就像这样;

$a = Array(
    1 => Array(
         0 => 'Peter',
         1 => 17
    ),
    0 => Array(
         0 => 'Nina',
         1 => 21
    ),
    2 => Array(
         0 => 'Bill',
         1 => 15
    ),
);
function compareByName($a, $b) {
  return strcmp($a[0], $b[0]);
}
usort($a, 'compareByName');
print_r($a);

在此之后,您只需要对内容进行迭代并做任何您想做的事情,例如可能输出到csv或其他内容。

答案 1 :(得分:0)

我认为您可以用这种方式完成排序,尽管老实说,数据库是一个更好的解决方案。

以下内容使用匿名回调函数作为usort的第二个参数,该参数允许我们设置所需的排序规则。

$file=__DIR__ . '/sort-target.txt';
$lines=file( $file, FILE_SKIP_EMPTY_LINES | FILE_TEXT | FILE_IGNORE_NEW_LINES  );

usort( $lines, function( $a, $b ){
    list( $id_a, $name_a, $age_a )=array_filter( explode(':',$a) );
    list( $id_b, $name_b, $age_b )=array_filter( explode(':',$b) );
    return $name_a > $name_b;
} );


printf('<pre>%s</pre>', print_r( $lines, true ) );

源文件的内容为:

1:hannah.smith:20:
2:bob.jones:40:
3:james.williams:19:
4:ben.higgins:25:
100:andrew.ross:70:

输出为:

Array
(
    [0] => 100:andrew.ross:70:
    [1] => 4:ben.higgins:25:
    [2] => 2:bob.jones:40:
    [3] => 1:hannah.smith:20:
    [4] => 3:james.williams:19:
)

答案 2 :(得分:0)

您好,您可以将数据分成多个数组以备进一步使用,然后按字母顺序排序希望会对您有所帮助。

 // checking if file exists    
if(file_exists('file.txt')){    
 //open the file and get ready for reading Data    
 //make sure your file has permission on your server to read the file    
 $handle = fopen('files.txt', 'r');    
 if($handle) {    
  $Id = array();
  $email = array();
  $order = array();
  while(!feof($handle)){
   $data = explode(':', fgets($handle, 1024), 3);
   //store data in your array for futher use
   $Id[] = $data[0];
   $email[] = $data[1];
   $order[] = $data[2];
  }

  //sort array alphabetical order
  sort($email);
  foreach ($email as $emails) {
   echo '<pre>';
   echo print_r($emails);
   echo '<pre>';
  }

 }else{
   echo 'error openning file!';
  }

}else{
  echo '<p>File not found!</p>';
}