2012-04-03 65 views
1

我有这种类型的关联数组。PHP根据关联数组中的几个关联删除类似的数组

Array 
(
[0] => Array 
    (
     [bookedArea] => Comp Pool 
     [laneBooked] => 1 
     [paidBy] => Edmonton Aurora Synchronized Swim Club 
     [startTime24hr] => 16:00 
     [finishTime24hr] => 18:00 
    ) 

[1] => Array 
    (
     [bookedArea] => Comp Pool 
     [laneBooked] => 2 
     [paidBy] => Edmonton Aurora Synchronized Swim Club 
     [startTime24hr] => 16:00 
     [finishTime24hr] => 18:00 
    ) 

[2] => Array 
    (
     [bookedArea] => Comp Pool 
     [laneBooked] => 3 
     [paidBy] => Keyano Swim Club 
     [startTime24hr] => 16:00 
     [finishTime24hr] => 18:00 
    ) 
) 

我想创建一个新的数组删除类似的条目取决于几个关联。 startTime24hr,finishTime24hr bookedArea & paidBy如果所有4不一样,那么它不应该被删除。另外,我想捕获新关联数组中的第一条和最后一条通道。

Array 
    (
    [0] => Array 
    (
     [bookedArea] => Comp Pool 
     [firstLaneBooked] => 1 
     [lastLaneBooked] => 2 
     [paidBy] => Edmonton Aurora Synchronized Swim Club 
     [startTime24hr] => 16:00 
     [finishTime24hr] => 18:00 
    ) 
    [2] => Array 
    (
     [bookedArea] => Comp Pool 
     [firstLaneBooked] => 3 
     [lastLaneBooked] => 3 
     [paidBy] => Keyano Swim Club 
     [startTime24hr] => 16:00 
     [finishTime24hr] => 18:00 
    ) 
) 

我发现这将帮助我过滤只有一个关联。但是我需要3个以上。

$copy = $array; // create copy to delete dups from the array you wish to filter from 
$newFilteredArray = array(); // new filtered array. 
$item1 = 'startTime24hr'; // the association you want to filter with. 
for($i=0; $i<count($array); $i++) { 
    if (in_array($array[$i][$item1], $newFilteredArray)) { 
     unset($copy[$i]); 
    } 
    else { 
     $newFilteredArray [] = $array[$i][$item1] 
    } 
} 
print_r($copy); 

编辑---- 谢谢亚历山大帮助我得到正确的迭代。

我一直在努力插入我的过滤数组开始和结束车道。我已经评论了我尝试使其工作。当它的未注释我得到:Notice: Undefined index: startTime24hr它看起来像它在一些无限循环。 但如果你评论我的东西没有通知。有人能帮忙吗? 函数array_push_assoc($ array,$ key,$ value){ $ array [$ key] [] = $ value; return $ array; }

$CPfilteredArray = array(); 
$lanes = 0; 
for($i = 0; $i < count($compPoolArray); $i++) { 
    $add = true; 
    // $lanesAdded = false; 
    // $lanes = $lanes + 1; 
    // $startLane = $compPoolArray[$i]["laneBooked"]; 
    for($j = 0; $j < count($CPfilteredArray); $j++) { 
    if(($compPoolArray[$i]["startTime24hr"] === $CPfilteredArray[$j]["startTime24hr"]) 
     && ($compPoolArray[$i]["finishTime24hr"] === $CPfilteredArray[$j]["finishTime24hr"]) 
     && ($compPoolArray[$i]["bookedArea"] === $CPfilteredArray[$j]["bookedArea"]) 
     && ($compPoolArray[$i]["paidBy"] === $CPfilteredArray[$j]["paidBy"])) { 
      $add = false; 
      // $lanes = $lanes + 1; 
      // $lanesAdded = True; 
    } 
    } 
    if($add) { 
     $CPfilteredArray[] = $compPoolArray[$i]; 
     // if ($lanesAdded){ 
     //  $lastLane = $startLane + $lanes; 
     //  $CPfilteredArray[$i] = array_push_assoc($CPfilteredArray, 'firstLane', $startLane); 
     //  $CPfilteredArray[$i] = array_push_assoc($CPfilteredArray, 'lastLane', $lastLane); 
     // } 
     // else { 
     //  $CPfilteredArray[$i] = array_push_assoc($CPfilteredArray, 'firstLane', $startLane); 
     //  $CPfilteredArray[$i] = array_push_assoc($CPfilteredArray, 'lastLane', $startLane); 
     // } 
    } 
} 

回答

1

两个循环周期完成这项工作。

$filteredArray = array(); 
for($i = 0; $i < count($array); $i++) { 
    $add = true; 
    for($j = 0; $j < count($filteredArray); $j++) { 
    if(($array[$i]["startTime24hr"] === $filteredArray[$j]["startTime24hr"]) 
     && ($array[$i]["finishTime24hr"] === $filteredArray[$j]["finishTime24hr"]) 
     && ($array[$i]["bookedArea"] === $filteredArray[$j]["bookedArea"]) 
     && ($array[$i]["paidBy"] === $filteredArray[$j]["paidBy"])) { 
     $add = false; 
    } 
    } 
    if($add) $filteredArray[] = $array[$i]; 
} 

结果数组$filteredArray包含过滤的元素。

+0

这工作就像一个魅力。谢谢。 – CamSyl 2012-04-03 20:18:23

1

我知道它没有真正回答(不允许评论尚未......)您的问题,但如果您从数据库检索数据,您可以使用查询来检索分组值。 它可能看起来某事像这样(伪SQL)

SELECT 
    bookedArea 
    ,paidBy 
    ,startTime24hr 
    ,finishTime24hr 
    ,MIN(laneBooked) 
    ,MAX(laneBooked) 
FROM 
    reservation -- ?? 
WHERE 
--condition 
GROUP BY 
    bookedArea 
    ,paidBy 
    ,startTime24hr 
    ,finishTime24hr 
+0

我试图暂时不使用数据库。感谢寿。 – CamSyl 2012-04-03 20:46:51

1

如果你知道你用什么元素来合并数组值你也可以使用一个HashMap上做插入合并。所以一旦你添加一个元素到数组中,你就创建了一个散列

$bookings = array(); 
$hash = md5($arr['bookedArea'] . $arr['paidBy'] . $arr['startTime24hr'] . $arr['finishTime24hr']); 
if (array_key_exists($hash, $bookings)){ 
    //add just another lane to the booking 
} 
else{ 
    //create a new booking entry 
} 

这样你的代码可能会更有效率。

+0

看起来非常精简。我会玩这个,我不完全确定它是如何工作的。但我会在php.net中查看array_key_exists。谢谢 – CamSyl 2012-04-03 20:49:56

+0

这很简单。你创建一个散列,并通过array_key_exists获取信息,这里有一个项目,其中有相同的信息编码在散列中。更多信息可以在这里找到http://en.wikipedia.org/wiki/Hash_table – MatthiasLaug 2012-04-06 12:16:13

1

这也可能工作:(您可以替换序列化功能,只序列选定的元素)

<?php 

$arr=array(
     0=>array("a"=>1, "b"=>"hello"), 
     1=>array("a"=>2, "b"=>"hellooo"), 
     2=>array("a"=>1, "b"=>"hello"), 
     ); 

function removeDuplicates(&$arr){ 
    $index=array(); 
    $result=array(); 
    foreach ($arr as $key=>$val){ 
     $k=serialize($val); 
     if(!isset($index[$k])){ 
      $index[$k]=$key; 
      $result[$key]=$val; 
     } 
    } 
    return $result; 
} 

$result=removeDuplicates($arr); 

print_r($arr); 
print '<br>'; 
print_r($result); 
?>