数组,需要通过键排序

时间:2010-03-31 00:55:30

标签: php arrays search

好的,不太确定如何做到这一点。我有从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循环中等同于一个数组,就像这样......

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

好的,现在我有两个信息数组,一个来自数据库($ old),另一个来自$ _POST位置($ new),我希望我的数组键正确。

现在我需要弄清楚哪一个已经改变了,从旧的到新的比较。而且,需要更新数据库,其中包含新盖子=旧盖子的所有新位置,以及每个阵列的新中间=旧中间位置。我确定我不得不以某种方式使用array_key或array_key_intersect,但不确定究竟如何...... ???

另外,我不认为UPDATE在foreach循环中会有用,也许有办法在UPDATE查询中执行CASE语句?

另外,我是否正确地采取了这种方式?或者我应该采用另一种方式,而不是使用muli维数组。

基本上我需要在数据库中更新相同键中的每个数组=更改值,我需要更新数据库中的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 :(得分: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检查键和值,并在上面的示例中返回$ new [$ id]中不在$ old [$ id]

中的所有键/值对的数组

所以你最终会得到与$ new和$ old

结构相同的数组$

然后你可以:

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

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

答案 1 :(得分: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;
}

干杯:)