我已经尝试这样做了好几个星期,而我一直在寻找和尝试许多不同的方式来解决先前提出的问题。
我有一个文本(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";
}
答案 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>';
}