Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Перестановка элементов в массиве
 
 автор: Eser   (22.02.2011 в 12:43)   письмо автору
 
 

Народ подскажите не догоняю.
Есть массив:
Array ( [0] => 29 [1] => 30 [2] => 31 [3] => 32 [4] => 33 [5] => 34 [6] => 35 )

Как переставить ключи со значениями?
Например поменять местами Ключ 0 с Ключем1
Что б было так:
Array ( [1] => 30 [0] => 29 [2] => 31 [3] => 32 [4] => 33 [5] => 34 [6] => 35

  Ответить  
 
 автор: Trianon   (22.02.2011 в 12:46)   письмо автору
 
   для: Eser   (22.02.2011 в 12:43)
 

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

  Ответить  
 
 автор: Eser   (22.02.2011 в 12:48)   письмо автору
 
   для: Trianon   (22.02.2011 в 12:46)
 

А со значениями как? Я просто не могу уловить суть как это сделать

  Ответить  
 
 автор: Trianon   (22.02.2011 в 12:54)   письмо автору
 
   для: Eser   (22.02.2011 в 12:48)
 

исходная строка у вас упорядочена по значениям (ключей).

Чтобы предложить что-то иное, нужно выяснить, откуда взялся новый порядок.

  Ответить  
 
 автор: cheops   (22.02.2011 в 12:54)   письмо автору
 
   для: Eser   (22.02.2011 в 12:48)
 

А в чем логика такой перестановки? Нужно отсортировать значения или вывести их в каком-то порядке, т.е. в чем конечная цель?

  Ответить  
 
 автор: cheops   (22.02.2011 в 12:47)   письмо автору
 
   для: Eser   (22.02.2011 в 12:43)
 

Хм... скорее всего придется из элементов первого массива собирать новый вручную или в полуавтоматическом варианте, если таких перестановок нужно осуществить несколько (вообще на это полагаться не принято, Trianon дело говорит). А в связи с чем возникла такая задача, может каким-то другим путем воспользоваться можно?

  Ответить  
 
 автор: Eser   (22.02.2011 в 13:04)   письмо автору
 
   для: cheops   (22.02.2011 в 12:47)
 

Народ боюсь вас щас запутать.
Но вот собственно какая задача.
Из Таблицы выводятся в одну колонку значения(в том порядке в котором они были записаны).
Ну например так.
Адрес
Номер заявки
Телефон
Модель

Не всегда их порядок вывода на экран удобен для пользователя.
По этому есть необходимость рядом с каждым выводимым элементом сделать срелку "Вниз" и "Вверх" что бы они могли перемещаться друг относительно друга.
Суть идеи что бы изменить их порядок расположения в таблице.
Что бы на пример при нажатии на кнопку "Вверх" ,элемент с большим ID перезаписывался на место ID с мегьшим значением.
Например есть так

ID1-Адрес
ID2-Номер заявки
ID3-Телефон
ID4-Модель

а нужно например так

ID1-Номер заявки
ID2-Модель
ID3-Адрес
ID4-Телефон

Надеюсь понятно обрисовал картину.

  Ответить  
 
 автор: cheops   (22.02.2011 в 13:13)   письмо автору
 
   для: Eser   (22.02.2011 в 13:04)
 

Главный вопрос: А откуда изначально берутся данные? Из файла, базы данных?

Второстепенный вопрос: Порядок заданный пользователем запоминается для каждого пользователя или администратор сайта выставляет этот порядок для всех? Или же этот порядок устанавливается только в рамках сессии и при следующем заходе на сайт его нужно будет устанавливать по-новой?

  Ответить  
 
 автор: Trianon   (22.02.2011 в 13:33)   письмо автору
 
   для: Eser   (22.02.2011 в 13:04)
 

>Не всегда их порядок вывода на экран удобен для пользователя.
>По этому есть необходимость

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

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

  Ответить  
 
 автор: Eser   (22.02.2011 в 14:45)   письмо автору
 
   для: Trianon   (22.02.2011 в 13:33)
 

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

Да можно было бы сделать отдельный столбик,но все дело в том что у меня есть соответствия(id справочника и id организации) и все это в одной таблице. Может быть несколько организаций и каждой свой свой набор справочников, соответственно доп столбик тут не катит.
Что бы это реализовать надо несколько таблиц соответствия делать по каждую фирму. Что не очень хочеться
Поэтому то идея была
Запихать нужные ID записи в массив.
Так как на странице конкретного пользователя выводятся нужные только ему записи, то мы получаем актуальный массив.
Т.е получаеться массив типа:
1=>id2
2=>id3
4=>id4
ну и т.д
Далее тыкая на кнопку например "Вверх", для записи id4. Что бы id4 поменялаcь местами c id3
Ищем в массиве ближайший элемент который меньше id4 по значению и момент нахождения меняем значения в таблице
Ну например по такой логике:
Сохранить значения id3 во временной таблице
Взять значения id4 и обновить id3
Из временной таблицы вытягиваем значения id3
И обновляем значения в id4.
Обнуляем временную таблицу.

  Ответить  
 
 автор: Trianon   (22.02.2011 в 14:53)   письмо автору
 
   для: Eser   (22.02.2011 в 14:45)
 

таблица соответствия делается одна.
И в ней достаточно ключевых полей, чтобы однозначно определить положение конкретной записи для конкретного пользователя. (good_id, user_id, position)Tckb у пользjdfnTckьЕсли
быть открыто несколько таких списков (например, несколько заказов) - ( good_id, order_id, position)

  Ответить  
 
 автор: Eser   (22.02.2011 в 15:28)   письмо автору
 
   для: Trianon   (22.02.2011 в 14:53)
 

Щас попробую

  Ответить  
 
 автор: sim5   (22.02.2011 в 17:08)   письмо автору
 
   для: Eser   (22.02.2011 в 13:04)
 

Такую сортировку написать не сложно, в смысле, указывая новый порядковый номер (значение сортировки) каждому элементу списка. Но более удобно такие сортировки делать с мощью JavaScript, например, для jQuery есть много плагинов сортировок все и вся, при получении данных останется только обновить поле сортировки. Уиникальный идентификатор зачем трогать.

  Ответить  
 
 автор: Eser   (24.02.2011 в 14:08)   письмо автору
 
   для: sim5   (22.02.2011 в 17:08)
 

Спасибо за советы на будущее очень пригодяться.
Но пока сделал через буферную таблицу мож кому пригодиться:
Это пока черновик но вроде работает.
Где $_GET['down'] и $_GET['up'] это id записей
if(isset($_GET['down']))
{
$value=$_GET['down'];


asort($array);
$rez=FALSE;
while($avalue=current($array)) {
    if($avalue<$value) {
        next($array); continue;
    } elseif($avalue==$value) {
        $rez=next($array); break;
    }
}
if((( !$rez) ? $close='Это последний элемент':""));
if(!isset($close))
{
$select1=mysql_query("select name,type,status from atribute where id='$rez';");//Значания заменяемого эл
$data1=mysql_fetch_array($select1);
$update=mysql_query("update bufer_atribute set name='$data1[name]',type='$data1[type]',status='$data1[status]' where id='1';");//Переносим в буффер значания заменяемого эл
$select2=mysql_query("select name,type,status from atribute where id='$_GET[down]';");//Значания заменяемого эл
$data2=mysql_fetch_array($select2);

$update=mysql_query("update atribute set name='$data2[name]',type='$data2[type]',status='$data2[status]' where id='$rez';");//Делаем обмен $rez->$_GET[down]

$select3=mysql_query("select name,type,status from bufer_atribute where id='1';");//Переносим из буффера значания заменяемого эл
$data3=mysql_fetch_array($select3);
$update=mysql_query("update atribute set name='$data3[name]',type='$data3[type]',status='$data3[status]' where id='$_GET[down]';");
}
}

if(isset($_GET['up']))
{
$value=$_GET['up'];


asort($array);
$rez=FALSE;
while($avalue=current($array)) {
    if($avalue<$value) {
        next($array); continue;
    } elseif($avalue==$value) {
        $rez=prev($array); break;
    }
}
if((( !$rez) ? $close='Это верхний элемент':""));
if(!isset($close))
{
$select1=mysql_query("select name,type,status from atribute where id='$rez';");//Значания заменяемого эл
$data1=mysql_fetch_array($select1);
$update=mysql_query("update bufer_atribute set name='$data1[name]',type='$data1[type]',status='$data1[status]' where id='1';");//Переносим в буффер значания заменяемого эл
$select2=mysql_query("select name,type,status from atribute where id='$_GET[up]';");//Значания заменяемого эл
$data2=mysql_fetch_array($select2);

$update=mysql_query("update atribute set name='$data2[name]',type='$data2[type]',status='$data2[status]' where id='$rez';");//Делаем обмен $rez->$_GET[up]

$select3=mysql_query("select name,type,status from bufer_atribute where id='1';");//Переносим из буффера значания заменяемого эл
$data3=mysql_fetch_array($select3);
$update=mysql_query("update atribute set name='$data3[name]',type='$data3[type]',status='$data3[status]' where id='$_GET[up]';");
}
}

  Ответить  
 
 автор: sim5   (24.02.2011 в 14:16)   письмо автору
 
   для: Eser   (24.02.2011 в 14:08)
 

Да нет уж, спасибо, что-то слишком много "букав" ).

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования