WHILE循环中的PHP数组排序

时间:2016-01-20 22:51:33

标签: php arrays sorting

我有一个很大的问题,我找不到任何方法来排序数组条目。我的代码:

<?php
error_reporting(0);
$lines=array();
$fp=fopen('file.txt, 'r');
$i=0;
while (!feof($fp))
{
    $line=fgets($fp);
    $line=trim($line);
    $lines[]=$line;
    $oneline = explode("|", $line);
    if($i>30){
    $fz=fopen('users.txt', 'r');
    while (!feof($fz))
{
    $linez=fgets($fz);
    $linez=trim($linez);
    $lineza[]=$linez;
    $onematch = explode(",", $linez);
    if (strpos($oneline[1], $onematch[1])){
        echo $onematch[0],$oneline[4],'<br>';
    }
    else{
    }
    rewind($onematch);
}
    }
    $i++;
}
fclose($fp);
?>

问题是,我想对$ oneline [4]回应的项目进行排序。我从stackoverflow尝试了几个其他帖子 - 但是找不到解决方案。

1 个答案:

答案 0 :(得分:2)

您的问题的解决方案是,为了对$oneline[4]进行排序(似乎包含字符串值),您需要应用以下步骤:

  1. 将字符串拆分为数组($oneline[4] = explode(',', $oneline[4])
  2. 对结果数组(sort($oneline[4])
  3. 进行排序
  4. 将数组合并为一个字符串($oneline[4] = implode(',', $oneline[4])
  5. 由于我得到的印象变量命名在优先级列表中很低,我正在重新使用$oneline[4]变量。主要是为了澄清我所指的代码的哪一部分。

    话虽如此,如果您希望与未来的自我交谈(如果您需要在几个月内处理此代码),那么您应该进行其他改进。

    • 选择一种编码风格并坚持下去,原始代码看起来像是从至少4个不同来源复制/粘贴(大多数不一致的引号和花括号)
    • 尝试限制重复的代价高昂的操作,例如尽可能打开文件(公平地说,agents.data可以包含31行,而users.txt只会打开一次,导致我看起来像傻瓜)

    我已更新您的代码示例,以尝试通过上述各点显示我的意思。

    <?php
    error_reporting(0);
    $lines = array();
    $users = false;
    
    $fp = fopen('http://20.19.202.221/exports/agents.data', 'r');
    while ($fp && !feof($fp)) {
        $line = trim(fgets($fp));
        $lines[] = $line;
        $oneline = explode('|', $line);
    
        //  if we have $users (starts as false, is turned into an array
        //  inside this if-block) or if we have collected 30 or more 
        //  lines (this condition is only checked while $users = false)
        if ($users || count($lines) > 30) {
            //  your code sample implies the users.txt to be small enough
            //  to process several times consider using some form of 
            //  caching like this
            if (!$users) {
                //  always initialize what you intend to use
                $users = [];
    
                $fz = fopen('users.txt', 'r');
                while ($fz && !feof($fz)) {
                    $users[] = explode(',', trim(fgets($fz)));
                }
                //  always close whatever you open.
                fclose($fz);
            }
    
            //  walk through $users, which contains the exploded contents 
            //  of each line in users.txt
            foreach ($users as $onematch) {
                if (strpos($oneline[1], $onematch[1])) {
                    //  now, the actual question: how to sort $oneline[4]
                    //  as the requested example was not available at the
                    //  time of writing, I assume
                    //  it to be a string like: 'b,d,c,a'
    
                    //  first, explode it into an array
                    $oneline[4] = explode(',', $oneline[4]);
                    //  now sort it using the sort function of your liking
                    sort($oneline[4]);
                    //  and implode the sorted array back into a string
                    $oneline[4] = implode(',', $oneline[4]);
    
                    echo $onematch[0], $oneline[4], '<br>';
                }
            }
        }
    }
    fclose($fp);
    

    我希望这不会冒犯你太多,只是试图提供帮助,而不仅仅是为手头的问题提供解决方案。