PHP - 使用foreach删除重复项?

7

我有一个页面编号的数组:

foreach($elements as $el) {
$pageno = $el->getAttribute("pageno");

echo  $pageno ;
}

很遗憾,它包含了重复项。我尝试了以下代码,但它没有返回任何内容:

foreach(array_unique($elements) as $el) {
$pageno = $el->getAttribute("pageno");

echo  $pageno ;
}

如何删除重复的页码?提前感谢您的帮助 :)

它的工作方式符合我的预期,https://3v4l.org/iPoZk。也许`$elements`不是一个数组?`getAttribute`听起来像是domdocument对象吗? - chris85
1
为什么不使用 array_unique() 函数呢? - GrumpyCrouton
@GrumpyCrouton 在第二个 foreach 中实际上使用了 array_unique。 - Frankich
除非它是多维数组,否则对我来说这根本就没有意义。如果是多维数组的话,那么只需使用两次即可。 - GrumpyCrouton
@MacBooc 但是你假设了数组的结构。在我看来,OP没有提供足够的细节说明他们试图做什么。 - GrumpyCrouton
显示剩余2条评论
3个回答

14

由于我没有您的数据结构,所以我提供了一个通用解决方案。如果我们知道 $elements 的结构,这可以进行优化,但下面的代码应该适用于您。

$pageNos = array();
foreach($elements as $el) {
   $pageno = $el->getAttribute("pageno");
   if(!in_array($pageno, $pageNos))
   {
       echo $pageno ;
       array_push($pageNos,$pageno);
   }
}

基本上,我们只是使用一个额外的数组来存储已经打印的值。每次我们看到一个新值时,我们就打印它并将其添加到数组中。


谢谢!这个很好用。不过出现了语法错误。通过在“array_push($pageNos,$pageno)”后添加一个分号进行修复。 :) 还有一种方法可以对这个数组进行排序吗?它现在输出为:7 6 8 1 2 3 4 5。我希望它像这样:1 2 3 4 5 6 7 8。 - Jack
@Jack 你可以在 foreach 后直接使用 PHP 的 sort(),然后再次循环元素以显示页面编号。 - GrumpyCrouton

2
除了已经提供的答案,您还可以使用array_unique()
一个非常简单的例子:
$pageno = array_unique($pageno);

1
你可以创建一个临时页面编号列表。重复的实例将从 $elements 列表中移除:
// Create a temporary list of page numbers
$temp_pageno = array();
foreach($elements as $key => $el) {
    $pageno = $el->getAttribute("pageno");
    if (in_array($pageno, $temp_pageno)) {
        // Remove duplicate instance from the list
        unset($elements[$key]);
    }
    else {
        // Ad  to temporary list
        $temp_pageno[] = $pageno;
    }

    echo  $pageno ;
}

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