Xpoint
   [напомнить пароль]

Создание двухмерного массива из файла с разделителями

2001-09-30 01:52:50 [обр] Алексей Волков, он же muaddib [досье]

Я сначала опишу свою задачу, которую я пытаюсь решить, а потом опишу саму проблему (и метод решения, который мне не даётся).

Итак:
Есть БД, лежащая в файле — строки с разделителями „<<<“, по три значения в строке. БД грузится через file() в массив $strings. Теперь нужно сделать так: разделить строки по разделителю (на „колонки“) и получившийся двухмерный массив отсортировать по одной из „колонок“.

Проблема:
я кладу в массив строки, обхожу их в цикле, делаю explode() и... Как работать дальше? Как создать двухмерную структуру в старом или организовать новый двухмерный массив? В какой стороне искать? explode() создаёт свой новый массив...

Я уже два часа изучаю FM, пытаюсь найти несложный пример с нужной функциональностью, но пока у меня ничего не выходит.

Может быть, я просто не с той стороны подхожу к решению?

спустя 33 минуты [обр] Алексей Волков, он же muaddib [досье]

Первичный результат: примерно так работает, как нужно.

 $sizeList = count($toDoList);

 for ($i=0;$i<$sizeList;$i++) {
 $toDoList[$i] = explode("<<<",$toDoList[$i]);
 }

 sort($toDoList);

 for ($i=0;$i<$sizeList;$i++) {
   $klm = count($toDoList[$i]);
   for ($k=0;$k<$klm;$k++) {
     echo($toDoList[$i][$k]."&nbsp;");
   }

   echo('<br>');
 }

Замечания:
· так и не понял, как сказать ему, по какой колонке (элементу) надо сортировать.
• natsort() в контексте данного примера убивает вин32-пхп наповал. скорблю.

спустя 10 часов [обр] Sergey Siryk [досье]

ммм, функции сортировки массивов в ПХП мне никогда ловерия не внушали, да и не могут они сортировать по русским буквам например. А двумерные массивы - так вообще, особенно в свет того, ято двумерный массив может быть орагизован двояко - и как массив векторов, т.е. одномерный массив одномерных массивов, или как чисто матрица - когда каждый элемент объявляется с помощью двух индексов. В свете отсутсвия типизации в ПХП эти два способа в общем-то сливаются в один ...

У тебя - первый способ, во всяком случае по способу формирования массива похоже.

Насколько я знаю, функция сортировки двумерных массивов (т.е. с заданием колонки, пот кторой соритировать), в ПХП нету (да и в любых жругих языках - тоже). Потому как для соритровки в общем случае требуется задавать т.н. функцию сортировки, т.е. павила больше-меньше. В развитых объектных языках для конструкций типа вектор иликоллекция есть возможность задавать функцию сортировки. Можно попытаться и в ПХП наваять что-то типа класса ТВектор, а потом наследовать от него новые классы, изменяя функуию сортировки. В области функуии сортировки, учитыая все ту же нетипизированность ПХПы, может быть даже не сильно сложно, но вот ограничения на работу со сложными объектыми структурами, накладываемые самой ПХПой ... там уже нужно извращаться (см. Архив, по поводу извратов в объектах там было неоднократно). Т.е. в результате на "большие" языки будет похоже очень мало.

Т.е. приходим к выводу исползовать более приземленные средства. Например, написать функцию сортировки матрицы самостоятельно (простейший поплавок или мнимаксную сортировку, Quicksort Хора наверное уже будет лишним).

Или ... отказаться от собствено матрицы и сортировать одномерный массив неразбитых строк стандартными функциями ПХП. Т.е. колонка, по которой нужно сортировать, выносится на первое место в строке, строка имплодится обратно и сортируется sort()-ом. Вроде как должно сработать. Написал и подумал - какой-то черти-шо получается с тасованием этих строк туда-сюда ... запутаться нафик можно :((

В общем с написанием нормальной функции сотировки матирцы - это самый правильный путь, потому как можно написать более универсальную вещь. Практическу такую же универсальную как класс, но намного более простую в реализации...

спустя 3 часа 9 минут [обр] Алексей Волков, он же muaddib [досье]

Сергей, отвечу по порядку.

Во-первых, и в-главных, я пришёл к абсолютно идентичному с твоими словами выводу о том, что не стоит заморачиваться со всякими сложными матрицами и привязкой одного к другому (иначе бы крыша моя, непривычная к математике, совсем поехала).

Во-вторых — sort() вполне себе ничего сортирует, причём делает это по первому, как я понял, элементу, поэтому, действительно, если вынести на первое место то, почему и нужно сортировать. К счастью, пока мне не пришлось столкнуться с необходимостью обработать сортировкой элементы с русскими буквами.

В-третьих - уже есть usort(), который в качестве аргумента принимает любую пользовательскую функцию, сравнивающую элементы. Поэтому своего не обязательно писать (если не считать этой самой функции). Но если очень хочется, или у кого-то есть — поделитесь.

спустя 18 часов [обр] [DF] [досье]
Может попробовать сортировать по символьному коду, первого символа.
В ПХП есть ord () которая выдает числовое значение.
спустя 7 дней [обр] Дмитрий Котеров [досье]

В отбщем, получается вот что:

define("SortBy",2); // номер колонки, по которой сортировать
function FCmp($a,$b) {
  // если нужна правильная работа с русскими буквами,
  // придется поэкспериментировать с локалью, либо же
  // написать свою функцию сравнения.
  return strcmp($a[SortBy],$b[SortBy]);
}

$Lines=array();
foreach(file("data.txt") as $line)
  $Lines[]=explode("<<<",chop($line));
usort($Lines,"FCmp");

спустя 3 дня [обр] Алексей Волков, он же muaddib [досье]
Дмитрий, спасибо, попробую — расскажу о результатах.
спустя 23 дня [обр] Алексей Волков, он же muaddib [досье]
До результатов я пока не дошёл, поэтому тему можнос спокойно отправлять в архив, так как решения Дмитрия Котерова кажется вполне подходящим случаю.
Powered by POEM™ Engine Copyright © 2002-2005