Созд. нов. массив,используя один массив в кач. ключей,а другой в кач. соотв. значений

Acraft

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

Я хотел написать скрипт который позволял бы выбирать элементы массива $list_tmp и задавать порядок следования выбранных элементов.
Т.е. выводится массив а напротив каждого элемента находится элемент формы "text", где я проставляю порядковый номер элемента.
После обработки выбранные элементы массива образуют массив $list и следуют именно в том порядке который я им задал. Использовать array_combine() не могу, т.к. работаю с PHP4
Идея алгоритма проста - из формы получаем 2 массива: $list_tmp - массив слов, $consecution - массив с цифрами, который отображают порядок в котором должены быть отсортированы выбранные элементы $list_tmp
В цикле от $i=0 до размера любого из 2-х массивов заполняем третий массив $list(mas[$i]))=$list_tmp[mas[$i]]
По моему, алгоритм должен работать, но тем не менее $list заполняется не в нужном порядке (почему отловить не могу).

Такой вот код, чтобы в примере избавиться от работы с базой, здесь используется заранее объявленный массив list_tmp.
PHP:
<?
if (isset($_POST['subm']))
  {
   $list=Array(); 
   $consecution=Array();

   $keys_array=array_keys($_POST);
   for ($i=0; $i<sizeof($keys_array); $i++)
      {
       if (substr($keys_array[$i],0,strpos($keys_array[$i],'_'))=='consec')
         {
          if (trim($_POST[$keys_array[$i]])!='')
            {
             $consecution[sizeof($consecution)]=trim($_POST[$keys_array[$i]])-1;
            }
         }
      }
   ?><hr><table width=100% border=1><?
   for ($i=0; $i<sizeof($_POST['list_tmp']); $i++)
      {
       ?>
         <tr>
          <td><?echo $_POST['list_tmp'][$i];?></td>
          <td><?echo $consecution[$i];?></td>
          <td><?echo 'list['.$consecution[$i].']=list_tmp['.$consecution[$i].']  --  '.$_POST['list_tmp'][$consecution[$i]].'<br>';?></td>
         </tr>
       <?
       $list[$consecution[$i]]=$_POST['list_tmp'][$consecution[$i]];
      }
   ?></table><hr><?

   ksort($list);
//   echo sizeof($_POST['list_tmp']).'<br>';
//   echo sizeof($list).'<br>';
   for ($i=0; $i<sizeof($list); $i++)
      {
       echo $list[$i].'<br>';
      }
   exit();
  }
$list_tmp=Array('list_1','list_2','list_3','list_4','list_5','list_6','list_7','list_8','list_9','list_10',);
?>
<center>
<form name="form_1" action="002.php" method="POST">
<table border="0">
<?
$k=0;
for ($i=0; $i<sizeof($list_tmp); $i++)
   {
    ?>
     <tr>
        <td><input type="checkbox" name="list_tmp[]" value="<?echo $list_tmp[$i]?>"></td>
        <td><?echo $list_tmp[$i];?></td>
        <td><input type="text" name="consec_<?echo $k;?>" value="" size="2"></td>
     </tr>
    <?
    $k++;
   }
?>
</table>
<input type="submit" name="subm" value="Submit">
</form>
Возможно будут комментарии не только по коду, но и по алгоритму. С удовольствием выслушаю.
 

Shturm

Гигант мысли
А практическая ценность у данной операции какая?
А то не очень понятны изначальные предпосылки подобных махинаций с данными формы)
 

hermit_refined

Отшельник
Скажу сразу - нифига не понял. Но если бы делал что-то похожее, то передавал данные как-нибудь так:
<input type="checkbox" name="list_tmp[$i]" value="$list_tmp[$i]">
<input type="text" name="consecution[$i]">
Жить проще было бы.
 

Acraft

Новичок
Автор оригинала: hermit_refined
Скажу сразу - нифига не понял. Но если бы делал что-то похожее, то передавал данные как-нибудь так:
<input type="checkbox" name="list_tmp[$i]" value="$list_tmp[$i]">
<input type="text" name="consecution[$i]">
Жить проще было бы.
Согласен, перемудрил, но list_tmp[] так и передается.
Что до практической цели, то например, есть картинки. Их имена лежат в базе. Мне нужно чтобы можно было менять порядок их следования. Я загоняю их имена в массив $list_tmp, там они идут по алфавиту.
Есть 2-й массив $consecution в котором записан порядок в котором они должны следовать относительно первого массива. Т.е. получается что нужно создать 3-й массив $list который будет иметь содержимое из первого массива, а ключи из второго.
PHP:
   for ($i=0; $i<sizeof($_POST['list_tmp']); $i++) 
      { 
       $list[$consecution[$i]]=$_POST['list_tmp'][$consecution[$i]]; 
      } 
   ksort($list);
не знаю, нужно ли делать в этом случае ksort(), но на результат это в данном случае не влияет.
 

HraKK

Мудак
Команда форума
$arrayImages = array('some1.gif','some2.gif','some3.gif');
$arraySort = array(1,3,2);
$i=0;
$result=array();
foreach($arrayImages as $image)
{
$result[$arraySort[$i]]=$image;
$i++;
}
 

Acraft

Новичок
Автор оригинала: HraKK
$arrayImages = array('some1.gif','some2.gif','some3.gif');
$arraySort = array(1,3,2);
$i=0;
$result=array();
foreach ($arrayImages as $image)
{
$result[$arraySort[$i]]=$image;
$i++;
}
Спасибо, действительно работает.
Я не знал что между foreach и for есть какая-то разница. Но тем не менее,
с FOR'ом результат сортировки не верен а при использовании FOREACH сортирует правильно.
Интересно почему?
 

AmadMike

Новичок
Ха, интересно это. Напиши код, который у тебя неправильно работает.
Чем неправильно:
PHP:
$arrayImages = array('some1.gif', 'some2.gif', 'some3.gif');
$arraySort = array(1, 3, 2);
$result = array();
for ($i = 0; $i < count($arraySort); $i++)
  $result[$arraySort[$i]] = $arrayImages[$i];
P.s. между foreach и for разница есть.
 

Acraft

Новичок
Автор оригинала: AmadMike
Ха, интересно это. Напиши код, который у тебя неправильно работает.
Чем неправильно:
PHP:
$arrayImages = array('some1.gif', 'some2.gif', 'some3.gif');
$arraySort = array(1, 3, 2);
$result = array();
for ($i = 0; $i < count($arraySort); $i++)
  $result[$arraySort[$i]] = $arrayImages[$i];
P.s. между foreach и for разница есть.
PHP:
<?
$list_tmp=Array('list_1','list_2','list_3','list_4','list_5','list_6','list_7','list_8','list_9','list_10',);
$consecution=Array(2,4,6,8,0,9,7,5,3,1);
$list=Array();
for ($i=0; $i<sizeof($_POST['list_tmp']); $i++)  
    {  
      $list[$consecution[$i]]=$_POST['list_tmp'][$consecution[$i]];  
    }  
ksort($list);
// ^^^^^^^^^^^^^ сортирует неверно
//порядок следования элементов $list_tmp меняется, но не соответствует $consecution
// ==============================
unset($list);
$list=Array();
$i=0;
foreach ($list_tmp as $list_name)
          {
           $list[$consecution[$i]]=$list_name;
           $i++;
          }
// ^^^^^^^^^^^^^ сортирует верно
//получаем массив $list, где в качестве ключей используется $consecution, а значений $list_tmp.
//т.е. результат $list=Array(list_5, list_10, list_1, list_9, list_2, ist_8, ist_3, ist_7, ist_4, ist_6) -
//что и требовалось.
?>
 

AmadMike

Новичок
Внимательно посмотри на код:
PHP:
$result[$arraySort[$i]] = $arrayImages[$i];
А у тебя фактически получилось:
PHP:
$result[$arraySort[$i]] = $arrayImages[$arraySort[$i]];
Так работает: ?
PHP:
$list[$consecution[$i]]=$_POST['list_tmp'][$i];
 

Acraft

Новичок
Автор оригинала: AmadMike
Внимательно посмотри на код:
PHP:
$result[$arraySort[$i]] = $arrayImages[$i];
А у тебя фактически получилось:
PHP:
$result[$arraySort[$i]] = $arrayImages[$arraySort[$i]];
Так работает: ?
PHP:
$list[$consecution[$i]]=$_POST['list_tmp'][$i];
Да, глюк разработчика, т.е. меня :)

p.s.: сервер работает с 4-й версией PHP
 
Сверху