基于特定键值删除重复项

3

有一个多维数组,类似于这个:

$A = array(
  [0]=>
  array(
    ["rel"]=> 4
    ["name"]=> "Bar"
    ...
  )
  [1]=>
  array(
    ["rel"]=> 2
    ["name"]=> "Bar"
    ...
  )
  [2]=>
  array(
    ["rel"]=> 1
    ["name"]=> "Foo"
    ...
  )
  [3]=>
  array(
    ["rel"]=> 5
    ["name"]=> "Bar"
    ...
  )
  [4]=>
  array(
    ["rel"]=> 4
    ["name"]=> "Tee"
    ...
  )
)

我希望根据特定键删除重复项,同时保留原始数组结构,除了索引键。
以这个例子为例,假设我想删除具有相同键["name"]的子数组。
因此,最终结果应该是这样的:
$X = array(
  [0]=>
  array(
    ["rel"]=> 4
    ["name"]=> "Bar"
    ...
  )
  [1]=>
  array(
    ["rel"]=> 1
    ["name"]=> "Foo"
    ...
  )
  [2]=>
  array(
    ["rel"]=> 4
    ["name"]=> "Tee"
    ...
  )
)

我正在寻找一种有效的解决方案来解决这个问题。
理想情况下,一个array_unique函数可以接受一个键值作为参数,以在给定数组中查找重复项。 $X = array_key_unique($A, 'name');

我不相信这个解决方案让我能够针对特定的键进行操作。请看$X数组,尽管具有不同的'rel'值,但它不包括$A的元素1和3。 - Oriol
2个回答

6
这个函数应该可以完成工作:
function array_key_unique($arr, $key) {
    $uniquekeys = array();
    $output     = array();
    foreach ($arr as $item) {
        if (!in_array($item[$key], $uniquekeys)) {
            $uniquekeys[] = $item[$key];
            $output[]     = $item;
        }
    }
    return $output;
}

并应用于上述特定问题:

$X = array_key_unique($A, 'name');

0

试试这个...

 for ($i = 0; $i < count($A); $i++)
    {
      $repeated= null;
      for ($j = $i+1; $j < count($A); $j++)
      {
        if (strcmp($A[$j]['name'],$A[$i]['name']) === 0)
        {
          $repeated= $j;
          break;
        }
      }
      if (!is_null($repeated))
        array_splice($A,$repeated,1);
    }
    print_r($A);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接