2015-04-25 4 views
0

Я написал этот сценарий:массива не сортировка при записи в файл

<?PHP 
$file_handle = fopen("info.txt", "rb"); 
while (!feof($file_handle)) { 
    $line_of_text = fgets($file_handle); 
    $parts[] = explode('|', $line_of_text); 
} 

fclose($file_handle); 
$a = $parts; 

function cmp($a,$b){ 
    return strtotime($a[8])<strtotime($b[8])?1:-1; 
}; 

uasort($a, 'cmp'); 
$failas = "dinfo.txt"; 
$fh = fopen($failas, 'w'); 

for($i=0; $i<count($a); $i++){ 
    $txt=implode('|', $a[$i]); 
    fwrite($fh, $txt); 
} 
fclose($fh); 
?> 

Когда я использую:

print_r($a); 

после

uasort($a, 'cmp'); 

Тогда я могу видеть, отсортированный массив. Но когда я пишу в файл, используя следующие команды:

$fh=fopen($failas, 'w'); 
for($i=0; $i<count($a); $i++){ 
    $txt=implode('|', $a[$i]); 
    fwrite($fh, $txt); 
} 
fclose($fh); 

Это показывает не отсортированную информацию, что я делаю неправильно?

ответ

2

Это должно работать для вас:

Здесь я сначала получить файл в массив с file(), где каждая строка является одним из элементов массива. Там я игнорирую пустые строки и новые строковые символы в конце каждой строки.

После этого я сортирую массив с usort(). Где я сначала получаю все даты и время от каждой строки на explode() 'ing. После этого я просто получаю временную метку каждой даты с помощью strtotime() и сравниваю ее, чтобы друг друга.

В конце я просто сохраняю файл с file_put_contents(), где я также добавляю новый символ строки в конце каждой строки с array_map().

<?php 

    $lines = file("test.txt", FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES); 

    usort($lines, function($a, $b){ 
     list($aDate, $aTime) = explode(" ", explode("|", $a)[substr_count($a, "|")]); 
     list($bDate, $bTime) = explode(" ", explode("|", $b)[substr_count($b, "|")]); 

     if(strtotime("$aDate $aTime") == strtotime("$bDate $bTime")) 
      return 0; 
     return strtotime("$aDate $aTime") < strtotime("$bDate $bTime") ? 1 : -1; 
    }); 

    file_put_contents("test.txt", array_map(function($v){return $v . PHP_EOL;}, $lines)); 

?> 

Боковые ноты:

Я бы порекомендовал вам сохранить эти данные в базу данных, где она много гибкой сортировки и получения данных!

EDIT:

Для людей, у которых есть версия PHP (echo phpversion();) под < 5.3, просто измените анонимные функции для нормальных функций и передать имя функции в виде строки, как это:

<?php 

    $lines = file("test.txt", FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES); 

    function timestampCmp($a, $b) { 
     $aExploded = explode("|", $a); 
     $bExploded = explode("|", $b); 

     list($aDate, $aTime) = explode(" ", $aExploded[substr_count($a, "|")]); 
     list($bDate, $bTime) = explode(" ", $bExploded[substr_count($b, "|")]); 

     if(strtotime("$aDate $aTime") == strtotime("$bDate $bTime")) 
      return 0; 
     return strtotime("$aDate $aTime") < strtotime("$bDate $bTime") ? 1 : -1; 

    } 

    function addEndLine($v) { 
     return $v . PHP_EOL; 
    } 

    usort($lines, "timestampCmp"); 

    file_put_contents("test.txt", array_map("addEndLine", $lines)); 

?> 
+0

Я получаю сообщение об ошибке: Ошибка синтаксиса: ошибка синтаксиса, неожиданный T_FUNCTION в ...... в строке 5 – Albance

+0

@Albance перезагрузите мой ответ, попробуйте/используйте код под редактированием. – Rizier123

+0

спасибо soo много !! :) – Albance

Смежные вопросы