Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP和2多维数组基于两个键值进行比较_Php_Arrays_Multidimensional Array - Fatal编程技术网

PHP和2多维数组基于两个键值进行比较

PHP和2多维数组基于两个键值进行比较,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我有两个这样的多维数组: $original = Array ( [0] => Array ( [time] => 1364690340 [memberid] => 90 [type] => single ) [1] => Array ( [time] => 1364690341 [memberid] => 92 [type] =&g

我有两个这样的多维数组:

$original = Array (
[0] => Array
    (
        [time] => 1364690340
        [memberid] => 90
        [type] => single
    )

[1] => Array
    (
        [time] => 1364690341
        [memberid] => 92
        [type] => fixed
    )

[2] => Array
    (
        [time] => 1364690342
        [memberid] => 96
        [type] => single
    )
)
$original = Array (
[0] => Array
    (
        [time] => 1364690340
        [memberid] => 90
        [type] => single
    )

[1] => Array
    (
        [time] => 1364690342
        [memberid] => 96
        [type] => single
    )
)
第二个是这样的

$new = Array (
[0] => Array
    (
        [time] => 1364825750
        [memberid] => 90
        [type] => single
    )

[1] => Array
    (
        [time] => 1364825751
        [memberid] => 92
        [type] => single
    )

[2] => Array
    (
        [time] => 1364825752
        [memberid] => 96
        [type] => single
    )

[3] => Array
    (
        [time] => 1364825753
        [memberid] => 111
        [type] => single
    )
)
我的问题是:我想根据memberid和type键搜索$original数组中的匹配项,如果memberid和type不相同->我想从$original数组中删除该数组。因此,在本例中,我希望将[0]数组和[2]数组保留为$new Array中的值。我与原始数组中的memberid和类型相同,但我希望删除[1]数组,因为memberid相同,但类型不同。因此,我的最终$original数组将如下所示:

$original = Array (
[0] => Array
    (
        [time] => 1364690340
        [memberid] => 90
        [type] => single
    )

[1] => Array
    (
        [time] => 1364690341
        [memberid] => 92
        [type] => fixed
    )

[2] => Array
    (
        [time] => 1364690342
        [memberid] => 96
        [type] => single
    )
)
$original = Array (
[0] => Array
    (
        [time] => 1364690340
        [memberid] => 90
        [type] => single
    )

[1] => Array
    (
        [time] => 1364690342
        [memberid] => 96
        [type] => single
    )
)

在不对数据进行任何假设的情况下,这里有一个低效的解决方案,O(m*n),如果m和n是数组的长度:

$new_original = array();
foreach ($original as $elem) {
  // let's see if $new has something with the same type and memberid
  foreach ($new as $candidate) {
    if ($candidate['type'] == $elem['type'] &&
        $candidate['memberid'] == $elem['memberid']) {
      // it does! let's keep $elem
      $new_original[] = $elem;
    }
  }
}

// reassign it to $original if desired
$original = $new_original;
但是,进行更高效的查找会更酷。例如,如果我们可以假设在
$new
中最多有一个元素具有给定的memberid:

// turn $new into a map
$new_as_map = array();
foreach ($new as $candidate) {
  $new_as_map[$candidate['memberid']] = $candidate;
}

$new_original = array();
foreach ($original as $elem) {
  if (isset($new_as_map[$elem['memberid']])) {
    $candidate = $new_as_map[$elem['memberid']];
    if ($candidate['type'] == $elem['type']) {
      $new_original[] = $elem;
    }
  }
}

// reassign it to $original if desired
$original = $new_original;

给你,只是测试了一下,它的工作原理和预期的一样

// Presuming your two arrays are still called $new & $original
$original = array(); // your data
$new = array(); // your data

$newArray = array();
foreach($original AS $key => $val){
    $newArray[$val['memberid'] . '-' . $val['type']] = $val;
}

$original = array();
foreach($new AS $key => $val){
    if(isset($newArray[$val['memberid'] . '-' . $val['type']])){
        $original[] = $newArray[$val['memberid'] . '-' . $val['type']];
    }
}

print_r($original);