2个数组:只保留具有不同值的元素
2 arrays: keep only elements with different value
我有 2 个数组:
Array
(
[0] => Array
(
[id] => 1
[fieldname] => banana
[value] => yellow
)
)
Array
(
[0] => Array
(
[id] => 1
[fieldname] => rome
[value] => city
)
[1] => Array
(
[id] => 2
[fieldname] => bla
[value] => yes
)
)
我想创建一个新数组,其中只包含 "id" 不同的元素。换句话说,我想得到这个输出:
Array
(
[0] => Array
(
[id] => 2
[fieldname] => bla
[value] => yes
)
)
[id] => 2 是唯一不同的 [id] 所以我保留它。
说我已经通过一堆低效的 foreach、if 语句和临时变量实现了我的目标。我真的不想为这个非常小的东西使用一大堆代码,所以我开始寻找一个原生的 PHP 函数,但没有成功。获得结果的最简单方法是什么?有没有可能我严格需要使用带有这么多 if 的 foreach?
这应该可以做到。不是很短,它确实使用了一个临时变量,所以可能不是你想要的。我将这两个数组命名为 one
和 two
.
$ids = array();
$result = array();
foreach ($one as $x) {
$ids[$x['id']] = 1; //This way, isset($x['id']) vill return true
}
foreach ($two as $x) {
if (!isset($ids[$x['id']])) {
$result[] = $x;
}
}
如果没有更紧凑的方法,我会感到惊讶。
编辑: 这是每个嵌套的替代变体。也不是特别短。
$result = array();
foreach ($one as $x) {
foreach ($two as $y) {
if ($x['id'] == $y['id']) {
//A match, lets try the next $x
continue 2;
}
}
//No matching id in $two
$result[] = $x;
}
您可以将 array_udiff 与函数一起使用。
Computes the difference of arrays by using a callback function for
data comparison.
Returns an array containing all the values of the first array that are not
present in any of the other arguments.
代码:
// Setup two arrays as per your question
$array1 = array (
'0' => array (
'id' => '1',
'fieldname' => 'banana',
'value' => 'yellow',
)
);
$array2 = array (
'0' => array (
'id' => '1',
'fieldname' => 'rome',
'value' => 'city',
),
'1' => array (
'id' => '2',
'fieldname' => 'bla',
'value' => 'yes',
)
);
// Setup the callback comparison function
function arrayCompare($array2, $array1) {
return $array2['id'] - $array1['id'];
}
// Use array_udiff() with the two arrays and the callback function
$arrayDiff = array_udiff($array2, $array1, 'arrayCompare');
print_r($arrayDiff);
以上代码returns如下:
Array (
[1] => Array (
[id] => 2
[fieldname] => bla
[value] => yes
)
)
我有 2 个数组:
Array
(
[0] => Array
(
[id] => 1
[fieldname] => banana
[value] => yellow
)
)
Array
(
[0] => Array
(
[id] => 1
[fieldname] => rome
[value] => city
)
[1] => Array
(
[id] => 2
[fieldname] => bla
[value] => yes
)
)
我想创建一个新数组,其中只包含 "id" 不同的元素。换句话说,我想得到这个输出:
Array
(
[0] => Array
(
[id] => 2
[fieldname] => bla
[value] => yes
)
)
[id] => 2 是唯一不同的 [id] 所以我保留它。
说我已经通过一堆低效的 foreach、if 语句和临时变量实现了我的目标。我真的不想为这个非常小的东西使用一大堆代码,所以我开始寻找一个原生的 PHP 函数,但没有成功。获得结果的最简单方法是什么?有没有可能我严格需要使用带有这么多 if 的 foreach?
这应该可以做到。不是很短,它确实使用了一个临时变量,所以可能不是你想要的。我将这两个数组命名为 one
和 two
.
$ids = array();
$result = array();
foreach ($one as $x) {
$ids[$x['id']] = 1; //This way, isset($x['id']) vill return true
}
foreach ($two as $x) {
if (!isset($ids[$x['id']])) {
$result[] = $x;
}
}
如果没有更紧凑的方法,我会感到惊讶。
编辑: 这是每个嵌套的替代变体。也不是特别短。
$result = array();
foreach ($one as $x) {
foreach ($two as $y) {
if ($x['id'] == $y['id']) {
//A match, lets try the next $x
continue 2;
}
}
//No matching id in $two
$result[] = $x;
}
您可以将 array_udiff 与函数一起使用。
Computes the difference of arrays by using a callback function for data comparison.
Returns an array containing all the values of the first array that are not present in any of the other arguments.
代码:
// Setup two arrays as per your question
$array1 = array (
'0' => array (
'id' => '1',
'fieldname' => 'banana',
'value' => 'yellow',
)
);
$array2 = array (
'0' => array (
'id' => '1',
'fieldname' => 'rome',
'value' => 'city',
),
'1' => array (
'id' => '2',
'fieldname' => 'bla',
'value' => 'yes',
)
);
// Setup the callback comparison function
function arrayCompare($array2, $array1) {
return $array2['id'] - $array1['id'];
}
// Use array_udiff() with the two arrays and the callback function
$arrayDiff = array_udiff($array2, $array1, 'arrayCompare');
print_r($arrayDiff);
以上代码returns如下:
Array (
[1] => Array (
[id] => 2
[fieldname] => bla
[value] => yes
)
)