2010-03-31 3 views
0

좋아, 어떻게해야할지 모르겠다. 내가 그렇게 같은 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); 

등 등

좋아, 그래서 난이 뚜껑 중순 배열 키를 제공하는 것입니다에 대해 생각할 수있는 가장 좋은 방법 및 내가 이렇게하면, 나는 기반 구축해야 또 다른 배열이 배열의 키를 비교해야 ... 그렇게 같은 쿼리의 while 루프 내 배열에 mposition 동일 지금

$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; 
} 

좋아, 그래서 지금은 데이터베이스 (기존 $)에서 정보를 원하시면, 1의 2 개 배열을 가지고 있고, $ _POST 위치 (새 $)에서 다른, 나는 내가 올바른 배열 키를 얻었기를 바랍니다.

이제 어떤 것이 바뀌 었는지 파악해야합니다. 예전과 새로운 것을 비교해야합니다. 또한 새로운 lid = 이전 뚜껑이있는 새 위치와 각 배열의 새 mid = old mid가있는 모든 데이터베이스로 데이터베이스를 업데이트해야합니다. 어떻게 든 array_key 또는 array_key_intersect를 사용해야 할 것이라고 확신하지만 정확히 어떻게 ... ???

또한 UPDATE가 foreach 루프에서 유용하다고 생각하지 않습니다. 아마도 UPDATE 쿼리에서 CASE 문을 수행하는 방법이 있을까요?

나는 올바른 방향으로 가고 있습니까? 또는이를 위해 다차원 배열을 사용하는 대신 다른 방법으로해야합니까?

기본적으로 동일한 키 내의 각 배열이 변경된 값을 데이터베이스에서 업데이트해야하며 데이터베이스에서 mid = mid (두 번째 키 값) 위치에서 업데이트해야합니다.

$newest = array(); 

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

을하지만 1 개 또는 2의 PHP 배열 함수이 할 수있는 더 좋은 방법이되지 않습니다 :

또한, 나는 그것이 좀 이렇게 될 거라고 생각해? 그리고 나는 여전히 어떤 가치가 변했는지 알아야합니다 .... arggg

답변

0

감사합니다. 도움을 주신 모든 분들께 감사드립니다. 정말 감사드립니다 !! 비록 내가 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

나는이 마지막 답변이 완전히 도움이되지 않았기 때문에이 전체 답변을 편집하고 있습니다.

나는이주의 사항 :


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 검사 키와 값, 그리고 위의 예제에있는 모든 키의 배열을 반환 그래서 당신은 배열 $로 끝날 것이다 $ 된 [$ 아이디]에없는 $ 새 [$ 아이디]에서/값 쌍

그와 같은 구조가 변경 $ 새롭고 그리고 $ 오래된

너는 할 수있다 :

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

중첩 된 foreach 문을 사용하여 다차원 배열을 반복하는 방법에 대해서는 잘 모르는 경우가 있습니다.

+0

내가 뭘 무엇 : $ 오래된 [$ 행 [ '뚜껑'] [$ 행 [ '미드'] = $ mposition; 은 $ new [$ id] [$ idpos] = $ pos와 같습니다. 그러나 가치는 다를 것입니다. array_diff_assoc()을 정확히 사용하려면 어떻게해야합니까? – SoLoGHoST

+0

또한 더 빠른 방법이 있습니다 : $ new = array(); \t \t \t \t의 foreach ($ currLayout $ C => $ D 등) \t \t \t \t $ 신규의 [$ C] [ \t \t { \t \t \t의 foreach ($ E => $ F로서 $의 d) $ e] = $ newLayout [$ c] [$ e]; \t \t 나는 데이터베이스에서 업데이트하는 것이 더 쉬울 것이라고 생각합니다. 변경하지 않은 모든 값을 얻고 싶기 때문에이 작업을 수행하고 싶습니다. – SoLoGHoST

+0

좋아, 내 마지막 답변 빨려서 완전히 편집하고 그것을 다시 썼습니다. 이게 더 도움이되기를 바랍니다. –

관련 문제