On March 26, 2019 we launched new MODX Forums. Please join us at the new MODX Community Forums.
Subscribe: RSS
  • Всем привет smiley

    Вопрос, детский smiley

    Есть некий двумерный массив $array:

    Array
    (
        [1] => Array
            (
                [0] => 1
                [1] => a
                [2] => э
                [3] => 44
            )
    
        [2] => Array
            (
                [0] => 2
                [1] => d
                [2] => ю
                [3] => 33
            )
    
        [3] => Array
            (
                [0] => 3
                [1] => b
                [2] => я
                [3] => 22
            )
    
        [4] => Array
            (
                [0] => 4
                [1] => c
                [2] => а
                [3] => 11
            )
    
    )
    

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

    usort($array, "sortir");
    
    //, где 
    
    function sortir($a, $b) {
           return strnatcasecmp($a[1], $b[1]); // если надо, к примеру, по второму столбцу сортирнуть
    }
    



    продолжаю smiley

    как мне передавать внутрь функции sortir номер столбца для сортировки? не варю в php wink ну, типа, какой-нить $id

    UPD

    вот решение моей проблемы:
    
    global $row_sortir;
    
    ....
    
    usort($array, "sortir");
    
    //, где 
    
    function sortir($a, $b) {
           global $row_sortir;
           return strnatcasecmp($a[$row_sortir-1], $b[$row_sortir-1]);
    }
    


      [img]http://jurist-info.ru/pic/rrr.jpg[/img]

      Безжалостный пияр!
      Artima -- неуч!
      Осторожно: преступная локализация -- modx-cms.ru
      Баштанник Андрей -- мегапрограммер из Белоруссии и поедатель говна, очень критично настроенный молодой человек!

      Дисклеймер для общительных: даю сам себе право транслировать в открытый эфир содержание лички, just for fun
    • http://ru.php.net/manual/ru/function.usort.php

      посмотрите первый комментарий. там как раз ваш случай.
        "Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein."

        Не используйте Revo для "просто сайтов". Используйте Evo

        Who can defeat the Russian bear?
      • grin Алексей, ты издеваешься надо мной? grin я не рублю в php, чтоб расшифровать там написанное, мне придётся переводить всё это с php на русский smiley я уже "догадался" как отсортировать, и это мне стоило не один год жизни smiley мне просто хочется внутрь функции передать аргумент smiley

        P.S. из общения с другом. я: надо бы выучить аглицкий, чтоб господа на иностранном форуме меня понимали правильно:) друг: лучше выучи другой язык! я: какой?! он: php grin grin grin grin grin
          [img]http://jurist-info.ru/pic/rrr.jpg[/img]

          Безжалостный пияр!
          Artima -- неуч!
          Осторожно: преступная локализация -- modx-cms.ru
          Баштанник Андрей -- мегапрограммер из Белоруссии и поедатель говна, очень критично настроенный молодой человек!

          Дисклеймер для общительных: даю сам себе право транслировать в открытый эфир содержание лички, just for fun
        • перевожу, там написано что в многомерном массиве сортировка по произвольному ключу не прибегая к программированию не возможна, поэтому и создали свою функцию код которой приведен.

          ты лучше стукнись в аську, я тебе помогу
            "Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein."

            Не используйте Revo для "просто сайтов". Используйте Evo

            Who can defeat the Russian bear?
          • стукнулся:)

            в общем, сортировка пашет, написал скрипт под это дело... есть, конечно, и с ним вопросы оптимизацинного характера, позырить реализацию можно здесь http://jurist-info.ru/gotovki/got_zao/ к примеру.

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

            для заинтересовавшихся: strnatcasecmp -- вот эта хрень сортирует в естественно-человеческом порядке убывания, если нужна другая сортировка, можно и другую ф-цию воткнуть...
              [img]http://jurist-info.ru/pic/rrr.jpg[/img]

              Безжалостный пияр!
              Artima -- неуч!
              Осторожно: преступная локализация -- modx-cms.ru
              Баштанник Андрей -- мегапрограммер из Белоруссии и поедатель говна, очень критично настроенный молодой человек!

              Дисклеймер для общительных: даю сам себе право транслировать в открытый эфир содержание лички, just for fun
            • код без камментов и неокультуренный пока

              $file = $f;
              $action = $modx->documentIdentifier;
              global $row_sortir;
              $row_id = 1;
              $Output =<<<EOD
              <form method="post" action="[~[*id*]~]">
                   <select name="selectId">       
                     <option value="1">по названию</option> 
              
                     <option value="3">по ИФНС</option>
                     <option value="4">по дате</option>  
                     <option value="5">по цене</option> 
                  </select>
              <input type="submit" name="submit" value="отсортировать">
              </form>
              EOD;
              echo $Output;
              
              if (isset($_POST["submit"])) {
                $row_id = $_POST["selectId"];
              }
              
              // Начало таблицы
              $table_start = "<table border=1 cellspacing=0 cellpadding=0 class=price>\n";
              echo $table_start;
              
              if ($row_id == 1) {
              echo "<colgroup><col class=sort_by></col><col span=5></col></colgroup>";
              }
              elseif ($row_id == 2) {
              echo "<colgroup><col></col><col class=sort_by></col><col span=4></col></colgroup>";
              }
              elseif  ($row_id == 3) { 
              echo "<colgroup><col span=2></col><col class=sort_by></col><col span=3></col></colgroup>";
              }
              elseif  ($row_id == 4) { 
              echo "<colgroup><col span=3></col><col class=sort_by></col><col span=2></col></colgroup>";
              }
              else { 
              echo "<colgroup><col span=4></col><col class=sort_by></col><col></col></colgroup>";
              }
              
              
              echo "\n<tr>\n";
              
              
              
              
              $row = 0; 
              
              $fp = fopen ("$file","r"); // файл открыт
              
              // получаем построчно данные из csv-файла с разделителями  
              while ($data = fgetcsv ($fp, 1000, ";")) { 
              
              $counter = count ($data); 
                
                  for ($c=0; $c<$counter; $c++) { 
              // Первую строчку таблицы выводим как заголовок 
                     if ($row == 0) { 
                     echo $th = "<th>$data[$c]</th>\n"; 
                                    } 
                               else { 
                                     
                       if ($c == 3) $data[$c] = date_convert ($data[$c]);
                       $huy[$row] = $data; // тупо нумеруем массив,построчно
                                    } 
                                                }   
              
              $r = $row; 
              if ($data['1'] != "$got") $huy[$row] = 0; //по второму столбцу мне сортировка не нужна, я просто отрубаю строчку по критерию
              $row++;
              } 
                                                      
              $row_sortir = $row_id;
              usort($huy, "sortir");  
              
              // Заканчиваем первую строку в таблице 
              $output .= "</tr>\n"; 
              
              for ($cc=0; $cc<$r; $cc++)
              {
              if ($huy[$cc] == 0)                   {
              $output .= "";
                                                    }                       
                                               else {
              $output .= "<tr>\n"; 
              for ($c=0; $c<$counter; $c++) 
              {
              if ($c == 1) {
              $output .= "<td class='".$c."'><strong>".$huy[$cc][$c]."</strong></td>\n";
                           }
                      else {
              $output .= "<td class='".$c."'>".$huy[$cc][$c]."</td>\n";
                           }
              }
              $output .= "</tr>\n";
                                                     }
               
              }
                                                      
              
              
              $output .= "</table>";
              
              fclose ($fp); 
              
              return $output;
              
              function sortir($a, $b) {
                     global $row_sortir;
                     return strnatcasecmp($a[$row_sortir-1], $b[$row_sortir-1]);
              }
              
              function date_convert($_s) {
                   $a = explode('.', $_s);
                   if (sizeof($a) != 3) return 'BUEEEEE!!!';
                   return trim($a[2]).'-'.trim($a[1]).'-'.trim($a[0]) ;
              }
              
                [img]http://jurist-info.ru/pic/rrr.jpg[/img]

                Безжалостный пияр!
                Artima -- неуч!
                Осторожно: преступная локализация -- modx-cms.ru
                Баштанник Андрей -- мегапрограммер из Белоруссии и поедатель говна, очень критично настроенный молодой человек!

                Дисклеймер для общительных: даю сам себе право транслировать в открытый эфир содержание лички, just for fun