需要帮助按内部值

时间:2017-08-07 19:46:19

标签: php sorting multidimensional-array

我使用文本文件作为小数据库,每行都有这种格式:

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>

我该如何解决?

4 个答案:

答案 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.
}