我从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
内部检查blanks
和duplicates
如何?然后将它们全部保存在一个新变量中。像这个
$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',
),
)