2012-04-03 5 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 
    ) 
) 

これは、1つの関連付けでフィルタリングするのに役立つでしょう。しかし、私はさらに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となり、それはいくつかの無限ループのようです。 しかし、あなたが私のものにコメントをつけても、通知はありません。誰もこれで助けることができますか? function 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

ループサイクルが2回あります。

$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

1

あなたの質問にはまだ答えません(まだコメントできません...)が、データベースからデータを取得している場合は、クエリを使用してグループ化された値を取得できます。あなたは、あなたはまた、挿入時にマージを行うにはHashMapを使用して、配列の値をマージするために使用するものの要素を知っています場合 それは

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

私はまだデータベースを使用しないようにしています。ありがとうtho。 – CamSyl

1

をこの(擬似-SQL)のようなSTHを見ることができます。だから、あなたはあなたのコードは、より効率的かもしれそのよう

$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

とても合理的に見えます。私はこれで遊ぶだろう、私はそれがどのように動作するのか完全にはわからない。しかし、私はarray_key_existsをphp.netで見ていきます。ありがとう – CamSyl

+0

かなり簡単です。ハッシュを作成し、array_key_exists経由で、ハッシュにエンコードされた同じ情報を持つアイテムが存在するという情報を取得します。詳細はこちらhttp://en.wikipedia.org/wiki/Hash_table – MatthiasLaug

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); 
?> 
関連する問題