2010-03-31 55 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); 

等等,等等

好了,我能想到的,这是给盖和中数组键的最好的事情,拥有它等于mposition到像这样的查询的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从数据库($旧),而另一个来自$ _ POST位置($新),我希望我得到的数组键是正确的。

现在我需要弄清楚哪一个已经改变了,比较从旧到新。此外,还需要更新数据库,使用新盖子=旧盖子以及每个阵列的新中间=旧中间的所有新位置。我敢肯定,我将不得不使用array_key或array_key_intersect,但不知道如何... ???

此外,我不认为一个更新会在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键和值,并在上面的示例返回所有键的数组在$新[$ ID] /值对不在$旧[$ ID]

所以,你最终会与数组$改变具有相同的结构,$新和$旧

然后你可以:

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

至于通过嵌套的foreach语句循环多维数组的方式,如果有更好的方法我不知道它。

+0

这就是我在做什么:$旧[$行[ '盖'] [$行[ '中'] = $ mposition; 将等于$ new [$ id] [$ idpos] = $ pos;但价值观将会不同。 如何正确使用array_diff_assoc()? – SoLoGHoST 2010-03-31 02:03:44

+0

另外,有没有更快的方法来做到这一点: $ new = array(); \t \t \t \t的foreach($ currLayout为$ C => $ d) \t \t { \t \t \t的foreach($ d为$ E => $ F) \t \t \t \t $新[$ C] [ $ e] = $ newLayout [$ c] [$ e]; \t \t} 我认为这是我想要做的,因为我也想获得所有未改变的值,我想在数据库中更新会更容易。 – SoLoGHoST 2010-03-31 02:20:55

+0

好的,我最后的回答很糟糕,所以我完全编辑并重写了它。我希望这个更有帮助 – 2010-03-31 17:59:56