我使用文本文件作为小数据库,每行都有这种格式:
3692|Giovanni|giojo982|0005405
9797|Stefano|stefy734|45367
2566|Marco|markkkk998|355647689
4721|Roberto|robn88|809678741
如果可能,我需要按字母顺序维护它们的索引。 目前,我正在使用此代码,但在这种情况下逻辑上它不再起作用。
阅读这篇文章How can I sort arrays and data in PHP?我没有发现与我的情景类似的内容。 所以,我想知道......有解决方案吗?
$db_friends = "db_friends.txt";
$dblines = file($db_friends);
if(isset($_GET['A-Z'])) {
asort($dblines);
}
if(isset($_GET['Z-A'])) {
arsort($dblines);
}
foreach($dblines as $key => $profile) {
list($uni_id, $name_surname, $textnum_id, $num_id) = explode("|", $profile);
echo $name_surname;
}
<a href="./?A-Z">A-Z</a>
<a href="./?Z-A">Z-A</a>
我该如何解决?
答案 0 :(得分:3)
我按字母顺序假设您尝试按字母顺序按第二列中的名称排序。问题是,arsort()
和$db_friends = "db_friends.txt";
$dblines = file($db_friends);
// split each line into an array
$dblines = array_map(function($line){
return explode('|', $line);
}, $dblines);
执行过于简单的比较来处理您提供给他们的数据类型。他们只是将行视为字符串,并按第一列中的数字排序。解决此问题的一种方法是在排序之前拆分行。
uasort()
然后您可以更轻松地按第二列排序。使用if (isset($_GET['A-Z'])) {
uasort($dblines, function(array $a, array $b) {
return strcmp($a[1], $b[1]);
});
}
if (isset($_GET['Z-A'])) {
uasort($dblines, function(array $a, array $b) {
return strcmp($b[1], $a[1]);
});
}
,您将维护索引关联。
foreach ($dblines as $key => $profile) {
list($uni_id, $name_surname, $textnum_id, $num_id) = $profile;
echo $name_surname;
}
显然,如果你做了那个改变,你就不再需要在迭代排序的数组时爆炸,就像在第一步中已经完成的那样。
[self presentViewController:@"<ViewControllerToBePresented>" animated:NO completion:nil];
答案 1 :(得分:1)
如果我理解你的问题,你可以尝试这个功能:
function sortValuesKeepKey($lines) {
//declare arrays to be used temporarily
$idNumbers = array();
$values = array();
$return = array();
//loop through each line and seperate the number at the beginning
//of the string from the values into 2 seperate arrays
foreach($lines as $line) {
$columns = explode("|", $line);
$id = array_shift($columns);
$idNumbers[] = $id;
$values[] = implode("|", $columns);
}
//sort the values without the numbers at the beginning
asort($values);
//loop through each value and readd the number originally at the beginning
//of the string
foreach($values as $key => $value) {
//use $key here to ensure your putting the right data back together.
$return[$key] = $idNumbers[$key]."|".$values[$key];
}
//return finished product
return $return;
}
只需将行作为数组传递给它,它应该正确地返回它。
答案 2 :(得分:1)
如果您只想按照要按字母顺序排列列的顺序放置列,则可以避免uasort()
调用的复杂性。此方法具有从左到右排序所有列数据的额外好处。这意味着,无论排序方向(asc或desc)如何,我的方法都会排序$rows[0]
,然后是$row[1]
,然后是$row[2]
,然后是$row[3]
。
我还逻辑地组合了两个if语句,并将ASC设置为默认排序方向。
代码:(Demo)
$txt=['9999|Marco|markkkk998|355647689','1|Marco|markkkk998|355647689','3692|Giovanni|giojo982|0005405','9797|Stefano|stefy734|45367','2566|Marco|markkkk998|355647689','4721|Roberto|robn88|809678741'];
foreach($txt as $row){
$values=explode('|',$row);
$rows[]=[$values[1],$values[0],$values[2],$values[3]]; // just reposition Name column to be first column
}
if(isset($_GET['Z-A'])) {
arsort($rows); // this will sort each column from Left-Right using Z-A
}else{
asort($rows); // (default) this will sort each column from Left-Right using A-Z
}
// var_export($rows);
foreach($rows as $i=>$profile) {
echo "$i {$profile[0]}\n"; // name value
}
输出:
2 Giovanni
1 Marco
4 Marco
0 Marco
5 Roberto
3 Stefano
答案 3 :(得分:0)
如果要按name_surname对值进行排序,请参阅以下代码
$db_friends = "db_friends.txt";
$dblines = file($db_friends);
// loop the lines
foreach($dblines as $key => $profile) {
// explode each line with the delimiter
list($uni_id, $name_surname, $textnum_id, $num_id) = explode("|", $profile);
// create an array with name_surname as a key and the line as value
$array[$name_surname] = $profile;
}
// bases on the GET paramater sort the array.
if(isset($_GET['A-Z'])) {
ksort($array); //sort acceding
}
if(isset($_GET['Z-A'])) {
krsort($array); // sort descending
}
// loop the sorted array
foreach($array as $key => $value) {
echo $key; // display the name_surname.
}