1

私はこのタイプの連想配列を持っています。

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&payedBy 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);

編集----反復を正しくするのを手伝ってくれたAlexanderに感謝します。

フィルター処理された配列に開始レーンと終了レーンを挿入するのに苦労しています。私はそれを機能させるための私の試みをコメントアウトしました。コメントがない場合、私は次のようになります。Notice: Undefined index: startTime24hr そして、それは無限ループにあるように見えます。しかし、あなたが私のものにコメントしても、通知はありません。誰かがこれを手伝うことができますか?function array_push_assoc($ array、$ key、$ value){$ array [$ key] [] = $ value; $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);
        // }
    }
}
4

4 に答える 4

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には、フィルター処理された要素が含まれます。

于 2012-04-03T20:05:52.447 に答える
1

私はそれがあなたの質問に実際には答えないことを知っています(まだコメントすることは許可されていません...)が、dbからデータを取得している場合は、クエリを使用してグループ化された値を取得できます。このように見える可能性があります(疑似SQL)

SELECT
     bookedArea
    ,paidBy
    ,startTime24hr
    ,finishTime24hr
    ,MIN(laneBooked)
    ,MAX(laneBooked)
FROM 
    reservation -- ??
WHERE
--condition
GROUP BY
    bookedArea
    ,paidBy
    ,startTime24hr
    ,finishTime24hr
于 2012-04-03T20:08:07.720 に答える
1

配列値をマージするために使用する要素がわかっている場合は、ハッシュマップを使用して挿入時にマージを実行することもできます。したがって、配列に要素を追加すると、ハッシュが作成されます。

$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
}

そうすれば、コードがさらに効率的になる可能性があります。

于 2012-04-03T20:13:40.400 に答える
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);
?>
于 2012-04-03T20:15:36.887 に答える