[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сортировка данных в текстовом файле...
brdm
Есть текстовый файл file.dat с данными (построчно) типа:

a|2
b|9
c|4
d|12
e|7

Нужно его перезаписать на самого себя но данные выстроить по убыванию значений после '|' Тоесть так:

d|12
b|9
e|7
c|4
a|2

Подскажите пожалуйста, как можно это сделать.

Спасибо.



Спустя 1 час, 8 минут, 12 секунд (2.03.2009 - 11:05) kirik написал(а):
Алгоритм:
1. Считываешь построчно файл (через file())
2. Разбиваешь каждую строку через разделитель "|" и записываешь в ассоциативный массив вида array('a' => '2', 'b' => '9'..) (explode() и for).
3. Сортируешь массив через ф-ю arsort() (желательно с флагом SORT_NUMERIC)
4. Для каждого элемента массива соединяешь ключ и значение через "|"
4.а Создаешь массив с соединенными значениями и implode'ишь через \n
4.б "Конкатенируешь" в одну строку в процессе соединения ключа и значения.
5. Пишешь обратно в файл

ЗЫ. Кодом получилось бы короче, но так как это в форуме "PHP основы" - попробуй написать сам smile.gif

Спустя 10 минут, 40 секунд (2.03.2009 - 11:16) Alchemist написал(а):
Небольшая поправка:
функция rsort() сбрасывает старые ключи, при описаном алгоритме лучше пользоваться функцией arsort()

Спустя 16 минут, 12 секунд (2.03.2009 - 11:32) kirik написал(а):
Цитата (Alchemist @ 2.03.2009 - 03:16)
функция rsort() сбрасывает старые ключи, при описаном алгоритме лучше пользоваться функцией arsort()

моя ошибка, спасибо! smile.gif поправил.

Спустя 4 часа, 30 минут, 23 секунды (2.03.2009 - 16:03) brdm написал(а):
Спасибо. В общих чертах вроде понятно, но..

file.dat...(тот-же, что в теме)

$popularr = file("file.dat");
// подсчет количества элементов массива
$pcount = count($popularr);
for($i = 0; $i < $pcount; $i++)
{
$rpopul[$i]=explode("|",$popularr[$i]);
дальше.. не доходит
}

Подскажите please как дальше.

Вообще не совсем понятно, как из file.dat составить ассоциативный массив (что значит ассоциативный?). Дальше вроде справлюсь.

Сппасибо.

Спустя 4 часа, 40 минут, 59 секунд (2.03.2009 - 20:44) kirik написал(а):
Цитата (brdm @ 2.03.2009 - 08:03)
Подскажите please как дальше.

PHP
<?php
// 1. Считываешь построчно файл (через file())
$file = file('file.dat', FILE_IGNORE_NEW_LINES);

// 2. Разбиваешь каждую строку через разделитель \"|\" и записываешь в ассоциативный массив вида array('a' => '2', 'b' => '9'..) (explode() и for).
for($i = 0, $c = count($file); $i < $c; $i++)
{
    $tmp = explode('|',$popularr[$i]);
    $elements[$tmp[0]] = $tmp[1];
}

// 3. Сортируешь массив через ф-ю arsort() (желательно с флагом SORT_NUMERIC)
arsort($elements, SORT_NUMERIC);

// 4. Для каждого элемента массива соединяешь ключ и значение через \"|\"
foreach($elements as $key => $val)
{
    $result = $key.'|'.$val;
}

// 4.а Создаешь массив с соединенными значениями и implode'ишь через \n
$result = implode(\"\n\", $result);

// 5. Пишешь обратно в файл
file_put_contents('file.dat', $result, LOCK_EX);


Цитата (brdm @ 2.03.2009 - 08:03)
что значит ассоциативный?

Ассоциативный массив, это массив в роли ключей которого могут выступать любые значения (строки).

Спустя 2 часа, 28 минут, 46 секунд (2.03.2009 - 23:12) brdm написал(а):
Большое спасибо.

Все получилось.

Спустя 1 год, 10 месяцев, 10 дней, 16 часов, 15 минут, 37 секунд (13.01.2011 - 15:28) air написал(а):
А если в строке данных больше и нужно отсортировать по второму "столбцу" все данные в файле?

Спустя 18 минут, 12 секунд (13.01.2011 - 15:46) Snus написал(а):
air

Соответственно, сортировка меняется в функции cmp. Все вполне интуитивно.


<?php

function
cmp($a, $b){
return strcmp($a['val1'], $b['val1']);
};

$file = 'test.txt';

$arr = array();
$handle = fopen($file, 'r');
if($handle){
while (!feof($handle)) {
list($val1, $val2) = explode('|', fgets($handle, 8192));
if(!empty($val1) and !empty($val2))
$arr[] = compact('val1', 'val2');
}
fclose($handle);
} else die('Не могу открыть файло');

usort($arr, 'cmp');

echo '<pre>';
print_r($arr);
echo '</pre>';

?>



файл test.txt

d|5
a|8
c|2
e|7



На выходе

Array
(
[
0] => Array
(
[
val1] => a
[val2] => 8

)

[
1] => Array
(
[
val1] => c
[val2] => 2

)

[
2] => Array
(
[
val1] => d
[val2] => 5

)

[
3] => Array
(
[
val1] => e
[val2] => 7

)

)



Спустя 1 день, 6 часов, 19 минут, 47 секунд (14.01.2011 - 22:06) Guest написал(а):
Если файл test.txt такой:

1234567890|b|2|q|
1234567891|d|9|w|
1234567892|c|4|e|
1234567893|a|12|r|
1234567894|d|7|t|

Вообще надо отсортировать по алфавиту второго столбца, но если значения совпадают, сортируется по третьему. Если и там совпадают, по четвёртому. Больше не надо.

Должно получиться:

1234567893|a|12|r|
1234567890|b|2|q|
1234567892|c|4|e|
1234567894|d|7|t|
1234567891|d|9|w|

Ну и записать обратно в файл результат желательно.

Честно говоря, ничего путного кроме этой темы не нашёл.

Спустя 4 дня, 46 минут, 5 секунд (18.01.2011 - 22:52) air написал(а):
Видимо, проблема... Когда в строке много данных, не получается.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.