好的,不太确定如何做到这一点。我有从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
答案 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;
}
干杯:)