我有一个多维数组,我想删除一个特定索引值重复的数组记录,我必须在丢弃记录之前使用一个条件。
例如,我的数组如下
array {
[0]
{ ["name"]=> string(12) "A1" ["status"]=> string(16) "Not Available" ["statusid"]=>4 ["num"]=> string(7) "33" }
[1]
{ ["name"]=> string(15) "A2" ["status"]=> string(16) "Available" ["statusid"]=>1 ["num"]=> string(7) "39" }
[2]
{ ["name"]=> string(21) "A3" ["status"]=> string(16) "Busy" ["statusid"]=>3 ["num"]=> string(7) "55" }
[3]
{ ["name"]=> string(12) "A4" ["status"]=> string(16) "Available" ["statusid"]=>1 ["num"]=> string(7) "54" }
[4]
{ ["name"]=> string(18) "A5" ["status"]=> string(16) "Busy" ["statusid"]=>3 ["num"]=> string(7) "33" }
}
在上面的数组中,我想检查"num"上的重复,如果它重复,那么我想删除具有较高"statusid"的记录,如上面的记录"num"在[0][num]和[4][num]重复,但我想保持行[4]因为它的[4][statusid]小于[0][statusid]。
使用一个简单的if
。你需要把它转移到另一个容器里。检查它是否已经设置,如果是,检查num
:
$new_array = array();
foreach($array as $a) {
if(!isset($new_array[$a['num']]) || $a['statusid'] < $new_array[$a['num']]['statusid']) {
$new_array[$a['num']] = $a;
}
}
这是你可以使用的一行代码:
$input = array_map("unserialize", array_unique(array_map("serialize", $input)));
您必须做两件事:首先比较表中的行,并创建一个函数,将一个数组复制到另一个数组(特定行除外)。
$k=0;
for($i=0;$i<$K;$i++)//fix one row
{
for($j=i+1;$j<$k;$j++)//compare with others rows
{
if($array[i]["num"] == $array[j]["num"])
{
if($array[i]["statusid"]< $array[j]["statusid"]
{
$array = copyTable($k,$j,$array);
$k--;//array length will be decremented by 1
}
else
{
$array = copyTable($k,$i,$array);
$k--;//array length will be decremented by 1
$i--;//fixed row will be delete, so stay in same position
}
}
}
}
function copyTable($tableLength,$indexOfRowToRemove,$previousArray)
{
$newArray = array();
for($i=0;$i<$tableLength;$i++)
{
if($i!=$indexOfRowToRemove)
{
$newArray[$i] = array(
'name' => $previousArray[$i]["name"],
'status' => $previousArray[$i]["status"],
'statusid' =>$previousArray[$i]["statusid"],
'num' => $previousArray[$i]["num"],
)
}
}
return $newArray;
}