PHP-删除基于键的数组中的重复值';s值和空值


PHP - Remove duplicate values in an array based on a key's value and empty values

我从PHP数组中得到以下输出:

Array ( 
[0] => Array ( 
     [set1] => Array ( 
            [link] => xyz.com/def
            [time] => 2016-01-03
    [set2] => Array ( 
            [link] => 
            [time] => ) 
    [set3] => Array ( 
            [link] => 
            [time] => ) 
    ) 
[1] => Array ( 
    [set1] => Array ( 
            [link] => xyz.com/123
            [time] => 2016-01-03) 
    [set2] => Array ( 
            [link] => 
            [time] => ) 
    [set3] => Array ( 
            [link] => xyz.com/123
            [time] => 2016-01-03) 
    ) 
[2] => Array ( 
    [set1] => Array ( 
            [link] => xyz.com/abc
            [time] => 2015-12-03) 
    [set2] => Array (
            [link] => xyz.com/abc
            [time] => 2016-01-03) 
    [set3] => Array ( 
            [link] => xyz.com/123456
            [time] => 2016-01-03) 
    ) )

我想消除重复的[link],而不考虑[time]——然后我想消除空的[link]值,如[0][set2],最后输出如下:

[link] => xyz.com/def
[time] => 2016-01-03
[link] => xyz.com/123
[time] => 2016-01-03) 
[link] => xyz.com/abc
[time] => 2015-12-03
[link] => xyz.com/123456
[time] => 2016-01-03

这就是我尝试的:

$categoryUrlArray= array_unique(($categoryUrlArray, SORT_REGULAR);
    foreach ($categoryUrlArray as $categoryUrlLevel01) {
        $categoryUrlLevel01= array_unique($categoryUrlLevel01, SORT_REGULAR);
        foreach ($categoryUrlLevel01 as $categoryUrlLevel02) {
            echo $categoryUrlLevel02['link'];
            echo '<br/>';
            echo $categoryUrlLevel02['time'];
            echo '<br/><br/><br/>';
        }
    }

上面代码的问题是没有消除重复,并且仍然显示空值,即有大量的换行符<br/>,这就是为什么我知道它们没有被消除。

inner loop内部检查blanksduplicates如何?然后将它们全部保存在一个新变量中。像这个

$newArr = array();
$links = array();
foreach($categoryUrlArray as $urls){
    foreach($urls as $url){
        if(!empty($url['link']) && !in_array($url['link'],$links)){
            $newArr[] = $url;
            $links[] = $url['link'];
        }
    }
}
var_dump($newArr);

将导致

array(4) {
  [0]=>
  array(2) {
    ["link"]=>
    string(11) "xyz.com/def"
    ["time"]=>
    string(10) "2016-01-03"
  }
  [1]=>
  array(2) {
    ["link"]=>
    string(11) "xyz.com/123"
    ["time"]=>
    string(10) "2016-01-03"
  }
  [2]=>
  array(2) {
    ["link"]=>
    string(11) "xyz.com/abc"
    ["time"]=>
    string(10) "2015-12-03"
  }
  [3]=>
  array(2) {
    ["link"]=>
    string(14) "xyz.com/123456"
    ["time"]=>
    string(10) "2016-01-03"
  }
}

只需添加一个条件来检查链接是否为空!empty($categoryUrlLevel02['link'])

以下是修改后的代码:

($categoryUrlArray= array_unique(($categoryUrlArray, SORT_REGULAR);
foreach ($categoryUrlArray as $categoryUrlLevel01) {
    $categoryUrlLevel01= array_unique($categoryUrlLevel01, SORT_REGULAR);
    foreach ($categoryUrlLevel01 as $categoryUrlLevel02) {
        if(!empty($categoryUrlLevel02['link']))
        {
            echo $categoryUrlLevel02['link'];
            echo '<br/>';
            echo $categoryUrlLevel02['time'];
            echo '<br/><br/><br/>';
        }
    }
}

有效识别结果数组中唯一值的最佳做法是在结果数组中分配临时键,并检查!isset()中的识别键(即link值)。如果您不想在输出中看到这些冗余/临时密钥,请调用array_values()

*请注意,与isset()相比,对in_array()进行迭代调用的性能成本肯定更高。

代码:(演示)

$categoryUrlArray = [
    [
        "set1" => ["link" => "xyz.com/def", "time" => "2016-01-03"],
        "set2" => ["link" => "", "time" => ""],
        "set3" => ["link" => "", "time" => ""]
    ],
    [
        "set1" => ["link" => "xyz.com/123", "time" => "2016-01-03"],
        "set2" => ["link" => "", "time" => ""],
        "set3" => ["link" => "xyz.com/123", "time" => "2016-01-03"]
    ],
    [
        "set1" => ["link" => "xyz.com/abc", "time" => "2016-12-03"],
        "set2" => ["link" => "xyz.com/abc", "time" => "2016-01-03"],
        "set3" => ["link" => "xyz.com/123456", "time" => "2016-01-03"]
    ]
];
foreach ($categoryUrlArray as $groups) {
    foreach ($groups as $row) {
        if ($row["link"] && !isset($result[$row["link"]])) {  if "truthy" (not empty) and unique
            $result[$row["link"]] = $row;
        }
    }
}
var_export(array_values($result));

输出:

array (
  0 => 
  array (
    'link' => 'xyz.com/def',
    'time' => '2016-01-03',
  ),
  1 => 
  array (
    'link' => 'xyz.com/123',
    'time' => '2016-01-03',
  ),
  2 => 
  array (
    'link' => 'xyz.com/abc',
    'time' => '2016-12-03',
  ),
  3 => 
  array (
    'link' => 'xyz.com/123456',
    'time' => '2016-01-03',
  ),
)