Массив, нужно сортировать через ключи - PullRequest
0 голосов
/ 31 марта 2010

Хорошо, не совсем уверен, как это сделать. У меня есть значения, которые выводятся из запроса SQL, например, так:

$row[0] = array('lid' => 1, 'llayout' => 1, 'lposition' => 1, 'mid' => 1, 'mlayout' => 1, 'mposition' => 0);
$row[1] = array('lid' => 2, 'llayout' => 1, 'lposition' => 0, 'mid' => 2, 'mlayout' => 1, 'mposition' => 0);
$row[2] = array('lid' => 2, 'llayout' => 1, 'lposition' => 0, 'mid' => 3, 'mlayout' => 1, 'mposition' => 1);
$row[3] = array('lid' => 3, 'llayout' => 1, 'lposition' => 1, 'mid' => 4, 'mlayout' => 1, 'mposition' => 1);
$row[4] = array('lid' => 4, 'llayout' => 1, 'lposition' => 2, 'mid' => 5, 'mlayout' => 1, 'mposition' => 0);   

и т.д.. и т.д.

Хорошо, так что самое лучшее, что я могу придумать для этого, это дать ключам lid и mid массива, чтобы они равнялись расположению в массиве в цикле while запроса, например ...

$old[$row['lid']][$row['mid']] = $mposition;

Теперь, если я сделаю это, мне нужно сравнить ключи этого массива с другим массивом, который мне нужно будет построить на основе массива $ _POST [].

$new = array();
foreach($_POST as $id => $data)
{
   // $id = column, but we still need to get each rows position...
   $id = str_replace('col_', '', $id);
   // now get the inner array...
   foreach($data as $pos => $idpos)
       $new[$id][$idpos] = $pos;
}

Хорошо, теперь у меня есть 2 массива информации, 1 из базы данных ($ old) и еще один из позиций $ _POST ($ new), я надеюсь, что ключи массива верны.

Теперь мне нужно выяснить, кто из них изменился, сравнивая старое с новым. А также, необходимо обновить базу данных всеми новыми позициями, где новая крышка = старая крышка, а новая середина = старая середина из каждого массива. Я уверен, что мне придется как-то использовать array_key или array_key_intersect, но не уверен, как именно ... ???

Кроме того, я не думаю, что UPDATE был бы полезен в цикле foreach, возможно, есть способ сделать оператор CASE в запросе UPDATE?

Кроме того, я поступаю правильно? ИЛИ я должен сделать это другим способом вместо использования многомерного массива для этого.

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

Кроме того, я думаю, что это будет примерно так:

$newest = array();

        foreach($old as $c => $d)
        {
            foreach($d as $e => $f)
                $newest[$c][$e] = $new[$c][$e];
        }

Но разве нет лучшего способа сделать это с 1 или 2 php функциями массива? И мне еще нужно знать, какие значения изменились .... arggg

Ответы [ 2 ]

0 голосов
/ 02 апреля 2010

Хорошо, спасибо, ребята, за всю вашу помощь, действительно очень ценю это !! Хотя я нашел лучший способ, так как он работает быстрее, чем array_diff_assoc. Это функция, которую я нашел, и после получения обоих массивов я просто использую $ updatedArray = array_diff_no_cast ($ new, $ old);

function array_diff_no_cast(&$ar1, &$ar2) {
   $diff = Array();
   foreach ($ar1 as $key => $val1) {
      if (array_search($val1, $ar2) === false) {
         $diff[$key] = $val1;
      }
   }
   return $diff;
}

Приветствия:)

0 голосов
/ 31 марта 2010

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

Я замечаю это:


foreach($old as $c => $d)
  {
    foreach($d as $e => $f)
      $newest[$c][$e] = $new[$c][$e];
  }

И я чувствую себя обязанным предложить подумать над именами ваших переменных. Очень описательные имена переменных помогают понять ваш собственный код и особенно помогают другим людям понять ваш код.

Теперь попробуем снова ответить на ваш вопрос ...

Я не часто использую array_diff_assoc (), но я полагаю, вы бы использовали это так:

$temp_changed=array();
foreach($new as $id => $mid){
    $temp_changed = array_diff_assoc($mid, $old[$id]);
    if(count($temp_changed)){
        $changed[$id] = $temp_changed;
    }
    unset($temp_changed);
}

Массив array_diff_assoc проверяет ключи и значения и в приведенном выше примере возвращает массив всех пар ключ / значение в $ new [$ id], которых нет в $ old [$ id]

Таким образом, вы получите измененный массив $, имеющий ту же структуру, что и $ new и $ old

Тогда вы можете просто:

foreach($changed as $id=>$mid){
  // Do UPDATE
}

Что касается способа циклического перемещения по многомерным массивам с вложенными операторами foreach, если есть лучший способ, о котором я не знаю.

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