Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перемещение строк вдоль таблицы, Проблема перемещения закрепленных внутри 
:(
    Опции темы
Zmiuko
  Дата 11.3.2009, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


http://zmiuko.ru
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 8.10.2008

Репутация: 2
Всего: 2



Такая проблема!

есть файл "base.txt" вида:
Код

данные #1 || данные #1 || данные #1 || 0
данные #2 || данные #2 || данные #2 || 0
данные #3 || данные #3 || данные #3 || 0
данные #4 || данные #4 || данные #4 || 1
данные #5 || данные #5 || данные #5 || 1
данные #6 || данные #6 || данные #6 || 1
данные #7 || данные #7 || данные #7 || 0
данные #8 || данные #8 || данные #8 || 1
данные #9 || данные #9 || данные #9 || 0
данные #10 || данные #10 || данные #10 || 1
данные #11 || данные #11 || данные #11 || 1
данные #12 || данные #12 || данные #12 || 0


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

Далее присутствует скрипт "1.php" c кодом:

Код

 if(isset($_GET["id"]))
 {
  $arr=file("./base.txt");
  $size=count($arr);
  if(isset($_GET["up"]))
  if(!$_GET["id"])
  array_push($arr,array_shift($arr));
  else
  {
   $tmp=$arr[$_GET["id"]-1];
   $arr[$_GET["id"]-1]=$arr[$_GET["id"]];
   $arr[$_GET["id"]]=$tmp;
  }
  elseif(isset($_GET["down"]))
  if($_GET["id"]==($size-1))
  array_unshift($arr,array_pop($arr));
  else
  {
   $tmp=$arr[$_GET["id"]+1];
   $arr[$_GET["id"]+1]=$arr[$_GET["id"]];
   $arr[$_GET["id"]]=$tmp;
  }
  else
   unset($arr[$_GET["id"]]);
  $open=fopen("./base.txt","w");
  @flock($open,2);
  fwrite($open,implode("\r\n",array_map("trim",$arr)));
  fwrite($open, "\r\n");
  @flock($open,3);
  fclose($open);


, который заставляет строки замещая друг-друга перемещаться вниз либо вверх вдоль таблицы.

Cуть проблемы:

необходимо перемещать строки так, чтобы закрепленные с индетификатором (допустим) "1" оставались на месте не меняя своего положения, другие же свободно перемещались.

Не могу продумать код для функции. 

PM MAIL WWW ICQ Skype Jabber   Вверх
Zmiuko
Дата 13.3.2009, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


http://zmiuko.ru
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 8.10.2008

Репутация: 2
Всего: 2



Никто не поможет? Идей нет никаких?
PM MAIL WWW ICQ Skype Jabber   Вверх
bars80080
Дата 13.3.2009, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



просто не понятно. зачем перемещать? с какой целью? просто отсортировать, не трогая отмеченные 1 строки? а по какому критерию?
PM MAIL WWW   Вверх
Zmiuko
Дата 13.3.2009, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


http://zmiuko.ru
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 8.10.2008

Репутация: 2
Всего: 2



Это меню, которое я дергаю из текстового файла, цель: необходимо произвести перемещение всех строк по номерам, либо вверх, либо вниз.. в зависимости от того какую команду дадут (переместить на одну позицию вверх, либо вниз соответственно)... но не трогая те что под указателем "1"..

То есть, строки перемещаем между собой, а если впереди строка с указателем, либо две-три... пять!.. то их просто перепрыгиваем. )
PM MAIL WWW ICQ Skype Jabber   Вверх
enof
Дата 13.3.2009, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 837
Регистрация: 23.1.2009
Где: Санкт-Петербург

Репутация: 30
Всего: 35



Код

function move($str, $line, $up = false)
{
    $arr_line = explode("\n",$str);
    if(($line < 1) || ($line > count($arr_line)) || ($line == 1 && $up) || ($line == count($arr_line) && !$up))
        return implode("\n",$arr_line);
    $line--;
    $mode = substr($arr_line[$line], -1);
    $move = $up ? -1 : 1;
    if($mode) return implode("\n",$arr_line);
        
    $c_line = $line;
    do
    {
        $m = substr($arr_line[$c_line],-1);
        $c_line += $move;
        if($m && (($c_line == count($arr_line) && !$up) || ($c_line < 0 && $up))) return implode("\n",$arr_line);
    }while(substr($arr_line[$c_line],-1));
    $tmp = $arr_line[$c_line];
    $arr_line[$c_line] = $arr_line[$line];
    $arr_line[$line] = $tmp;
    return implode("\n",$arr_line);
}

$str - исходный данные.
$line - номер строки, которую требуется переместить.
$up - направление перемещения, по умолчанию false-вниз, true - вверх.
Возвращает строку с перемещенными линиями, либо не перемещенными, если передан неверный номер линии или стоит запрет на перемещение.

Это сообщение отредактировал(а) enof - 13.3.2009, 22:41
PM MAIL ICQ Skype   Вверх
Zmiuko
Дата 13.3.2009, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


http://zmiuko.ru
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 8.10.2008

Репутация: 2
Всего: 2



Спасибо за старания, но не получается. Отдает пустой массив.

Надо бы разъяснить что к чему:

Короче, файл "base.txt" база ссылок в меню, и представляет собой строки, с данными идущими через разделитель, т.е.:

данные::данные::данные и т.д.:: указатель, передвигать ли данную строку либо перепрыгнуть ее в любом направлении так как она не должна двигаться

потом файл подключаем и проходим по нему циклом:

for($i=0;$i<count($arr);$i++) {

     $arr2 = explode("::", $arr[$i]);

     if($arr[3]=="1") { echo $arr[$i];} else { echo $arr[$i]." -- <a href=?id=${i}&up=>Поднять</a> --  <a href=?id=${i}&down=>Опустить</a>";}
     echo "<br>";

}


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

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

Наверно я тупой. Простите, господа, моск плавится...


PM MAIL WWW ICQ Skype Jabber   Вверх
enof
Дата 13.3.2009, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 837
Регистрация: 23.1.2009
Где: Санкт-Петербург

Репутация: 30
Всего: 35



Цитата(Zmiuko @  13.3.2009,  23:18 Найти цитируемый пост)
Спасибо за старания, но не получается. Отдает пустой массив.

 smile и как функция может вернуть массив?
Код

<?php
function move($str, $line, $up = false)
{
    $arr_line = explode("\n",$str);
    if(($line < 1) || ($line > count($arr_line)) || ($line == 1 && $up) || ($line == count($arr_line) && !$up))
        return implode("\n",$arr_line);
    $line--;
    $mode = substr($arr_line[$line], -1);
    $move = $up ? -1 : 1;
    if($mode) return implode("\n",$arr_line);
        
    $c_line = $line;
    do
    {
        $m = substr($arr_line[$c_line],-1);
        $c_line += $move;
        if($m && (($c_line == count($arr_line) && !$up) || ($c_line < 0 && $up))) return implode("\n",$arr_line);
    }while(substr($arr_line[$c_line],-1));
    $tmp = $arr_line[$c_line];
    $arr_line[$c_line] = $arr_line[$line];
    $arr_line[$line] = $tmp;
    return implode("\n",$arr_line);
}
$base = "данные #1 || данные #1 || данные #1 || 0
данные #2 || данные #2 || данные #2 || 0
данные #3 || данные #3 || данные #3 || 0
данные #4 || данные #4 || данные #4 || 1
данные #5 || данные #5 || данные #5 || 1
данные #6 || данные #6 || данные #6 || 1
данные #7 || данные #7 || данные #7 || 0
данные #8 || данные #8 || данные #8 || 1
данные #9 || данные #9 || данные #9 || 0
данные #10 || данные #10 || данные #10 || 1
данные #11 || данные #11 || данные #11 || 1
данные #12 || данные #12 || данные #12 || 0";
echo "<pre>" . move($base, 2);
?>

Прекрасно работает,  вторая строка меняется место с третьей.
PM MAIL ICQ Skype   Вверх
Zmiuko
Дата 13.3.2009, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


http://zmiuko.ru
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 8.10.2008

Репутация: 2
Всего: 2



Прости, тут что-то у меня не так.

Выдает:

<pre>данные #1 || данные #1 || данные #1 || 0
данные #2 || данные #2 || данные #2 || 0
данные #3 || данные #3 || данные #3 || 0
данные #4 || данные #4 || данные #4 || 1
данные #5 || данные #5 || данные #5 || 1
данные #6 || данные #6 || данные #6 || 1
данные #7 || данные #7 || данные #7 || 0
данные #8 || данные #8 || данные #8 || 1
данные #9 || данные #9 || данные #9 || 0
данные #10 || данные #10 || данные #10 || 1
данные #11 || данные #11 || данные #11 || 1
данные #12 || данные #12 || данные #12 || 0


, т.е. как и было..  smile

Добавлено через 2 минуты и 52 секунды
То есть пых выдает мне на экран тоже самое, что было и до обработки функцией. Ошибок нет.  smile 
PM MAIL WWW ICQ Skype Jabber   Вверх
enof
Дата 13.3.2009, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 837
Регистрация: 23.1.2009
Где: Санкт-Петербург

Репутация: 30
Всего: 35



Zmiuko, копипаст из редактора, у меня все работает.
Попробуйте вместо \n поставьте везде \r\n
PM MAIL ICQ Skype   Вверх
Zmiuko
Дата 13.3.2009, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


http://zmiuko.ru
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 8.10.2008

Репутация: 2
Всего: 2



smile действительно проблемка в "\r\n"... но как этой функцией перепрыгивать закрепленные темы? она же их двигает тольк?... прости за неугомонность )
PM MAIL WWW ICQ Skype Jabber   Вверх
enof
Дата 13.3.2009, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 837
Регистрация: 23.1.2009
Где: Санкт-Петербург

Репутация: 30
Всего: 35



Zmiuko, всмысле?
Код

move($base, 3);

все перепрыгивает нормально, или я чего-то непонимаю?
PM MAIL ICQ Skype   Вверх
Zmiuko
Дата 13.3.2009, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


http://zmiuko.ru
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 8.10.2008

Репутация: 2
Всего: 2



Извините за то что человек спит ))) действительно все просто, вот единственное не могу применить данную функцию к массиву, поможите?

Добавлено через 6 минут и 41 секунду
Да, препрыгивает. Просто необходимо именно под массив данных это преобразовать.

то у нас строки:

данные #1 || данные #1 || данные #1 || 0
данные #2 || данные #2 || данные #2 || 0
данные #3 || данные #3 || данные #3 || 0
данные #4 || данные #4 || данные #4 || 1

а то массив:

$base = array(
array("данные #1","данные #1","данные #1","0"),
array("данные #2","данные #2","данные #2","1"),
array("данные #3","данные #3","данные #3","0"),
array("данные #4","данные #4","данные #4","1"),
array("данные #5","данные #5","данные #5","1"),
array("данные #6","данные #6","данные #6","0")
);

читаем же из файла и парсим потом.
PM MAIL WWW ICQ Skype Jabber   Вверх
enof
Дата 13.3.2009, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 837
Регистрация: 23.1.2009
Где: Санкт-Петербург

Репутация: 30
Всего: 35



del
Добавлено @ 00:09
Код

function move($arr_line, $line, $up = false)
{
    if(($line < 0) || ($line > count($arr_line)-1) || ($line == 0 && $up) || ($line == count($arr_line)-1 && !$up))
        return $arr_line;
    $mode = $arr_line[$line][3];
    $move = $up ? -1 : 1;
    if($mode) return $arr_line;
    $c_line = $line;
    do
    {
        $m = $arr_line[$c_line][3];
        $c_line += $move;
        if($m && (($c_line == count($arr_line)-1 && !$up) || ($c_line < 0 && $up))) return $arr_line;
    }while($arr_line[$c_line][3]);
    $tmp = $arr_line[$c_line];
    $arr_line[$c_line] = $arr_line[$line];
    $arr_line[$line] = $tmp;
    return $arr_line;
}

вот, не увидел добавление к предыдущему посту.

Это сообщение отредактировал(а) enof - 14.3.2009, 00:09
PM MAIL ICQ Skype   Вверх
Zmiuko
Дата 14.3.2009, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


http://zmiuko.ru
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 8.10.2008

Репутация: 2
Всего: 2



))) все заработало... 

Кста, тут не подскажешь такую заботу - в моем коде сверху идет допустим так, без закреплений всяких, но если подымаешь 1 запись вверх, то она становится последней, а последняя верхней, тоже самое и если вниз опускать, в твоей функции можно такое разрешение сделать, закрепление же будет исключением: допустим подымаем вторую, первая закреплена и вторая перепрыгивает закрепленную первую и становится последней, тоже самое если бы двигали незакрепленную первую - тоже бы последней стала? ))

Первый раз с такой сортировкой сталкиваюсь. ))


PM MAIL WWW ICQ Skype Jabber   Вверх
enof
Дата 14.3.2009, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 837
Регистрация: 23.1.2009
Где: Санкт-Петербург

Репутация: 30
Всего: 35



Цитата(Zmiuko @  14.3.2009,  00:17 Найти цитируемый пост)
допустим подымаем вторую, первая закреплена и вторая перепрыгивает закрепленную первую и становится последней

не понял, нужно чтобы так было, или чтобы запрещено перескакивать сначала в конец и наоборот?(сейчас нельзя).
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1269 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.