Algoritmo di rotazione array

3

Sto sviluppando un'applicazione che invia preventivi ai clienti via email. Poiché le virgolette sono ottenute da varie risorse (per ogni cliente) finiscono in un unico array che viene poi utilizzato come fonte per l'e-mail.

La funzionalità desiderata è che il client non riceve lo stesso preventivo fino al completamento della rotazione completa, ma possono esserci nuove virgolette che appaiono nell'array poiché non ne controllo l'origine.

per es.

  1. Il client ha una serie di virgolette [Foo, Bar, Baz] .
  2. Algoritmo seleziona in modo casuale Bar da inviare, segnalandolo come inviato.
  3. La prossima citazione inviata è prelevata da [Foo, Baz] .
  4. Algoritmo seleziona a caso Foo da inviare, segnalandolo come inviato.
  5. Una nuova quota diventa disponibile Qux .
  6. La prossima citazione inviata è prelevata da [Baz, Qux] .
  7. Algoritmo seleziona a caso Baz da inviare, segnalandolo come inviato.
  8. La prossima citazione inviata è prelevata da [Qux] .
  9. Algoritmo seleziona Qux da inviare, segnalandolo come inviato.
  10. La prossima citazione inviata non ha articoli disponibili e i reroll hanno già inviato elementi, riprendendo da [Foo, Bar, Baz, Qux] .
  11. Algoritmo seleziona a caso Foo da inviare, segnalandolo come inviato.

ecc.

Riesco a immaginare che possa essere eseguito in questo modo, memorizzando i record di SentQuote già nel database e sottraendoli manualmente dall'array. Nel caso in cui ci siano zero corrispondenze, eseguirò il reroll - invalidando SentQuote .

Questo mi sembra un po 'ingombrante. Potrebbe esserci un modo migliore? Sto usando PHP 7.2

    
posta falnyr 12.07.2018 - 21:15
fonte

1 risposta

2

Potresti voler basare questo tempo in tempo reale, a differenza che sia già stato inviato o meno come se l'array si gonfiasse più velocemente di quanto non lo stia mandando; alcune persone potrebbero non ricevere mai un preventivo inviato e non ruoterà mai.

Dovrai fare qualcosa di simile (se solo PHP)

//$reset_time = <retrieve value of when you last cycled the list in epoch time, likely from database>
$clients = [
    [
        ["email"]     => "[email protected]",
        ["lastemailsent"]  => 0,
        ["pricedatawhateveretc"] => ...,
    ],
    [
        ["email"]     => "[email protected]",
        ["lastemailsent"]  => 1532965065,
        ["pricedatawhateveretc"] => ...,
    ],
];

function shouldSend($cl) {
    return $cl["lastemailsent"] < $reset_time;
}

Questo significa, devi recuperare tutti i risultati dal tuo database e scorrere su di essi in PHP (molto lentamente)

Se stai usando (My) SQL, memorizza reset_time in una tabella per "config", "settings" o "persistence", punti bonus per fare qualcosa di simile invece

$q = myAmazingQueryFunc("SELECT email, ... FROM prospective_clients WHERE LastEmailSent < :time OR LastEmailSent == 0", ["time" => $reset_time]);

Probabilmente vorrai anche aggiungere un'istruzione LIMIT Puoi rimuovere LastEmailSent == NULL e usare 0 invece di NULL. In questo modo puoi abbreviare la query in ... "WHERE LastEmailSent <: time"

Puoi anche cambiarlo da casuale a usando quando sono stati inviati per l'ultima volta un'e-mail, in modo che le persone non vengano picchiate frequentemente. Con questo metodo puoi in seguito cambiare il modo in cui le tue e-mail vengono inviate per aggiungere un limite di tempo (in modo che a qualcuno non venga inviata una e-mail, tu resetta il sistema e sono sfortunatamente il prossimo random scelto) come indicato per 1/0 "è già stata inviata una e-mail" e resetta tutti a zero

Considera se PHP è la lingua migliore per questo.

Oh, e qualunque cosa tu faccia, assicurati di avere un solo clic per annullare l'iscrizione / "smettere di mandarmi email adesso".

    
risposta data 30.07.2018 - 17:53
fonte

Leggi altre domande sui tag