【问题标题】:2 arrays: keep only elements with different value2个数组:只保留具有不同值的元素
【发布时间】:2015-06-27 00:13:06
【问题描述】:

我有 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?

【问题讨论】:

  • 当你说不同时,你是说所有的值都是唯一的还是只有 id?是否要删除具有重复元素的元素,包括原始元素和重复元素?
  • 处理它的经典方法是使用数组搜索php.net/manual/en/function.array-search.php

标签: php arrays array-difference


【解决方案1】:

您可以将array_udiff 与函数一起使用。

通过使用回调函数计算数组的差异 数据比较。

返回一个数组,其中包含第一个数组中所有非 出现在任何其他论点中。


代码:

// 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);

以上代码返回如下:

Array (

  [1] => Array (
    [id] => 2
    [fieldname] => bla
    [value] => yes
  )

)

【讨论】:

  • 说真的!回调是一种方式。谢谢。
【解决方案2】:

应该这样做。不是超级短,它确实使用了一个临时变量,所以可能不是你想要的。我已将两个数组命名为 onetwo

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多