2 votes

PHP : Fonction de boucle pour tous les 50 éléments

Situation : J'ai 160 identifiants dans un tableau, j'ai besoin de construire des requêtes xml, dans des ensembles de 50 maximum et de soumettre chaque ensemble séparément.

Problème : Comment boucler la fonction et continuer avec l'ID 51?function doBatch($ids)

Code simplifié :

function doBatch($ids)
{
    $start = "<feed>";

    foreach($ids as $id)
    {
        $add .= '<entry>'$id.'</entry>';
    }

    $stop = "</feed>";
    $data = $start.$add.$stop;
    post($data);
}

9voto

Alin Purcaru Points 21373

Vous pouvez diviser votre grand tableau en morceaux, avec array_chunk .

Edit :
Et voici une autre fonction de tableau peu connue (et je pense que celle-ci peut être nécessaire dans votre cas) : array_splice .

$arrayToLoop = array_splice($fullArray, 0, 50);
foreach($arrayToLoop as $id){
}
functionCall($fullArray);

Connaissez les fonctions de votre tableau, jeune sauterelle ! Tout 100 77 d'entre eux.

3voto

Dogbert Points 44003

Edit : pour que cela fonctionne, votre tableau doit être indexé numériquement à partir de 0. Vous pouvez passer en paramètre la 'valeur de départ'.

function doBatch($ids, $start = 0)
{
    $start = "<feed>";

    $end = min(count($ids), $start + 50);

    for($i = $start; $i < $end, $i++)
    {
        $add .= '<entry>'.$ids[$i].'</entry>';
    }

    $stop = "</feed>";
    $data = $start.$add.$stop;
    post($data);
}

Pour poster 10-59, appelez doBatch($ids, 10);

2voto

Raoul Duke Points 2091

Je ne comprends pas comment vous voulez structurer ceci mais jetez un coup d'oeil au code suivant :

function doBatch($ids) {
  $batches = array_chunk($ids, 50);
  foreach ($batches as $batch) {
    $data = "<feed>";
    foreach ($batch as $id) {
      $data .= "<entry>$id</entry>";
    }
    $data .= "</feed>";
    post($data);
  }
}

1voto

codaddict Points 154968

Si vous voulez traiter tous les identifiants en un seul appel de fonction de manière efficace, vous pouvez le faire :

function doBatch($ids,$limit) {

        $start = "<feed>";
        $stop = "</feed>";

        $add = '';  # initialize $add
        $i = 0;     # and i.

        foreach($ids as $id) {
                $add .= '<entry>'$id.'</entry>';
                $i++;

                # if limit has reached..post data.
                if($i == $limit) {
                        $i = 0;                            
                        post($start.$add.$stop);
                        $add = '';
                }       
        }

        # post any remaining ones.
        if($i) {
                post($start.$add.$stop);
        }
}

1voto

Felix Kling Points 247451

Vous pouvez utiliser le fait que PHP maintient un pointeur interne d'un tableau. Voici un exemple qui utilise each() y while boucles :

function processIDs(&$ids, $number) {
    reset($ids);
    $i = 0;
    $l = count($ids);
    while($i <= $l) {
      doBatch($ids, $number);
      $i += $number;
    }
}

function doBatch(&$ids, $number) {
  $i = 0;
  $start = "<feed>";
  while($i < $number && (list($key, $id) = each($ids))) {
      $add .= '<entry>'.$id.'</entry>';
      $i++;
  }

  $stop = "</feed>";
  $data = $start.$add.$stop;
  post($data);
}

Que vous utiliseriez avec :

  processIDs($ids, 50);

Aucun prétraitement du tableau n'est nécessaire et cela fonctionne quelles que soient les clés. Bien sûr, vous pouvez aussi créer une seule fonction, mais je voulais simplement réutiliser votre code.

Voir un exemple ici : http://codepad.org/Cm3xRq8B

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X