-1

私は現在、アジェンダアイテム(イベントなど)をインポートしてMySQLデータベースに配置する.csvインポートに取り組んでいます。私はそれの要点を機能させていますが、それを修正する方法やより効率的/より良いものにする方法について頭を悩ませることができない厄介なコードがあります。

私にとって厄介なコードの部分は、イベントが毎回開催されるtuesdayときsundayです2012-06-012013-04-01そして、これらの値のいくつかがすでにDBにあるかどうかを確認したい(ユーザーがいくつかの調整された値で.csvファイルを再度インポートする可能性があるため)。私の現在のコードは最終的に正しい値をDBに実装しますが、それが行われる方法はちょっと面倒です。ファイルが再度インポートされると、日曜日のすべての値が再び削除されます。これは、私のチェックが火曜日に最初にforeachを通過するためです。ここで、DB値が火曜日に生成された値と一致するかどうかがチェックされます。チェックが完了し、値がDBに挿入された後、私のforeachは日曜日のすべての値をチェックし(以前に挿入されたすべての値を含む配列を保持しているため、火曜日は削除されません)、それらを再度挿入します。したがって、基本的に.csvファイルをインポートすると、同じ値が削除されてから挿入されます。私の質問は、これをどのように防ぐかということです。

また、このコードを改善する方法を見つけた場合は(そもそも最初から効率的ではないと感じているため)、そう言ってください。非常にありがたいです。

イベントの繰り返しをチェックするコードは次のとおりです。説明やその他のコードが必要な場合は、お知らせください。

//REPEAT DAYS OF THE WEEK
if(!empty($repeatDayOfTheWeek) && $repeatDayOfTheWeek != '')
{
    $daysOfTheWeek = explode(',', $repeatDayOfTheWeek);

    foreach($daysOfTheWeek as $key => $dayOfTheWeek)
    {
        if(!is_numeric($dayOfTheWeek))
        {
            continue;
        }

        unset($agendaI->agendaItemValues['stopDate']);

        $beginDate = strtotime($tempStartDate);
        $endDate = strtotime($tempStopDate);

        $dayDates = array();
        $arrayDatesInDb = array();

        if(!isset($previousInserts))
        {
            $previousInserts = array();
        }

        if($beginDate != '' && $endDate != '')
        {
            while($beginDate <= $endDate)
            {
                if(date('N', $beginDate) == $dayOfTheWeek)
                {
                    $dayDates[] = date('Y-m-d', $beginDate);
                }

                $beginDate = strtotime("+1 day", $beginDate);
            }

        $datesInDb = $agendaI->getAgendaItemsByExternId($externId);

        if(empty($datesInDb))
        {
            foreach($dayDates as $dayDate)
            {
                dump("Empty DB - INSERT: ".$dayDate);
                $agendaI->setAgendaItemValue('startDate', $dayDate);
                $agendaI->saveAgendaItem();
                $previousInserts[] = $dayDate;
            }
        }
        else
        {
            dump('DB with records');
            foreach($datesInDb as $dateInDb)
            {
                if(!in_array($dateInDb->startDate, $dayDates) && !in_array($dateInDb->startDate, $previousInserts))
                {
                    dump("Not in Item-array, but in DB - DELETE: ".$dateInDb->startDate);
                    $agendaI->deleteAgendaItem($dateInDb->id);
                }
            }

        foreach($dayDates as $dayDate)
        {
            foreach($datesInDb as $dateInDb)
            {
                if($dayDate == $dateInDb->startDate)
                {
                    $arrayDatesInDb[] = $dateInDb->startDate;
                    dump("In array & in DB - UPDATE: ".$dateInDb->startDate);
                    $agendaI->setAgendaItemValue('id', $dateInDb->id);
                    $agendaI->saveAgendaItem();
                    $previousInserts[] = $dayDate;
                }
            }
        }

    unset($agendaI->agendaItemValues['id']);

    foreach($dayDates as $dayDate)
    {
        if(!in_array($dayDate, $arrayDatesInDb))
        {
            dump("Not in DB-array but in Item-array - INSERT: ".$dayDate);
            $agendaI->setAgendaItemValue('startDate', $dayDate);
            $agendaI->saveAgendaItem();
            $previousInserts[] = $dayDate;
        }
    }
}

.csvには次のフィールドがあります。

"Datum" "Tijdstip" "Evenement" "Locatie" "Website" "Toelichting" "Duits" "engels" "startdatum" "stopdatum" "herhalen dag van de week" "externid" "categorie" "via"

つまり
、DB内のレコードが.csv内のレコードと同じであるかどうかを確認する必要があります。csvにDBにあるレコードがない場合は、DBから削除する必要があります(現在のコードにはありますが、あまり効率的ではありません)

4

2 に答える 2

1

PHPでチェックを実装するのではなく、、、および列全体UNIQUEにインデックスを定義できます。次に、コマンドとともに使用して、これらのフィールドで一致する既存のレコードを新しいレコードに置き換えます。startdatumstopdatumherhalen dag van de weekREPLACELOAD DATA

ALTER TABLE events ADD UNIQUE INDEX (startdatum, stopdatum, dag);

LOAD DATA INFILE '/path/to/foo.csv'
  REPLACE
  INTO TABLE events;
于 2012-06-06T09:38:47.330 に答える
0

最終的には、$ daysofweekごとにforeachを使用せず、array_diffを使用せずに、次の方法で解決しました。

            //REPEAT DAYS OF THE WEEK
            if(!empty($repeatDayOfTheWeek) && $repeatDayOfTheWeek != '')
            {
                $daysOfTheWeek = explode(',', $repeatDayOfTheWeek);

                $agendaI->setAgendaItemValue('stopDate', '');

                $beginDate = strtotime($startDate);
                $endDate = strtotime($stopDate);
                $dayDates = array();
                $dbValues = array();
                $dbValues['datum'] = array();
                $latestDbValues = array();
                $toBeDeletedKeys = array();

                while($beginDate <= $endDate)
                {
                    if(in_array(date('N', $beginDate), $daysOfTheWeek))
                    {
                        $dayDates[] = date('Y-m-d', $beginDate);
                    }

                    $beginDate = strtotime("+1 day", $beginDate);
                }

                $evenementenInDb = $agendaI->getAgendaItemsByExternId($externId);

                if(!empty($evenementenInDb))
                {
                    foreach($evenementenInDb as $evenementInDb)
                    {
                        $dbValues['agendaid'][] = $evenementInDb->id;
                        $dbValues['datum'][] = $evenementInDb->startDate;
                    }
                }

                foreach($dayDates as $dayDate)
                {
                    $key = array_search($dayDate, $dbValues['datum']); 
                    if($key !== false && is_numeric($key))
                    {
                        //UPDATE
                        $agendaI->setAgendaItemValue('id', $dbValues['agendaid'][$key]);
                        $agendaI->setAgendaItemValue('startDate', $dayDate);
                        $agendaI->saveAgendaItem();
                        $latestDbValues[] = $dayDate;
                        dump('UPDATE');
                    }
                    else
                    {
                        //INSERT
                        unset($agendaI->agendaItemValues['id']);
                        $agendaI->setAgendaItemValue('startDate', $dayDate);
                        $agendaI->saveAgendaItem();
                        $latestDbValues[] = $dayDate;
                        dump('INSERT');
                    }
                }

                $toBeDeleted = array_diff($dbValues['datum'], $latestDbValues);
                foreach($toBeDeleted as $value)
                {
                    $toBeDeletedKeys[] = array_search($value, $dbValues['datum']);
                }

                foreach($toBeDeletedKeys as $toBeDeletedKey)
                {
                    //DELETE
                    $agendaI->deleteAgendaItem($dbValues['agendaid'][$toBeDeletedKey]);
                    dump('DELETE');
                }
            }
            else 
            { 
                //Normal, non repeating event
                //INSERT
                if(!empty($agendaItem) && is_numeric($agendaItem->id))
                {
                    $agendaI->setAgendaItemValue('id',$agendaItem->id);
                }

                $agendaId = $agendaI->saveAgendaItem();
            }
于 2012-06-07T13:17:45.447 に答える