PHP: функция цикла для каждых 50 элементов - PullRequest
2 голосов
/ 08 октября 2010

Ситуация: Получил 160 идентификаторов в массиве, необходимо создать XML-запросы, в наборах по 50 и представить каждый набор отдельно.

Проблема: Как зациклить функцию и продолжить с идентификатором 51? Function doBatch ($ ids)

Упрощенный код:

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

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

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

Ответы [ 7 ]

8 голосов
/ 08 октября 2010

Вы можете разбить ваш большой массив на куски, используя array_chunk .

Edit:
А вот еще одна малоизвестная функция массива (и я думаю, что она может понадобиться в вашем случае): array_splice .

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

Знай свой массив функций молодого кузнечика! Все 100 77 из них.

3 голосов
/ 08 октября 2010

Edit: чтобы это работало, ваш массив должен быть пронумерован с нуля Вы можете передать значение для запуска в качестве параметра.

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);
}

Чтобы опубликовать 10-59, звоните doBatch($ids, 10);

1 голос
/ 08 октября 2010

Я бы определенно пошел с array_splice(), как предложено Алин Пуркару.
С array_splice вы можете сделать:

while($chunk = array_splice($array, 0, 50)) {
    // do your stuff
}

Таким образом, вы получаете $chunk макс. 50 предметов, которые вы можете легко обработать.

1 голос
/ 08 октября 2010

Я бы сделал это.Синтаксис должен быть правильным, но я много играл с Python, поэтому вам может понадобиться исправить биты.В любом случае это должно подсчитать, сколько идентификаторов.Обведите цикл и сделайте 50, подсчитывая и удаляя 1 от общей суммы каждого цикла, выкладывайте их, продолжайте цикл, пока у нас не закончатся идентификаторы.

Является ли это лучшим способом сделать это, я не знаюно это будет работать.И это просто ... иш!

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

while $amount > 0
{
$count = 0;
while !($count = 50 || $amount = 0)
    {
        $count++;
        $amount--;
        $add .= '<entry>'.pop($ids).'</entry>';
    }

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

}

1 голос
/ 08 октября 2010

Вы можете использовать тот факт, что PHP поддерживает внутренний указатель массива.Вот пример, в котором используются циклы each() и while:

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);
}

, которые вы будете использовать с:

  processIDs($ids, 50);

Нет предварительной обработки массиванужно и работает независимо от ключей.Конечно, вы также можете создать только одну функцию, но я просто хотел повторно использовать ваш код.

См. Пример здесь: http://codepad.org/Cm3xRq8B

1 голос
/ 08 октября 2010

Если вы хотите обработать все идентификаторы в одном вызове функции эффективным образом, вы можете сделать:

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);
        }
}     
1 голос
/ 08 октября 2010

Я не понимаю, как вы хотите структурировать это, но посмотрите на следующий код:

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);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...