Как разбить строки в цикле foreach с помощью PHP

Использование следующего кода для отображения списка друзей из моего профиля в Twitter. Я хотел бы загружать только определенное число за раз, скажем 20, а затем предоставлять ссылки нумерации страниц внизу для первых 1-2-3-4-5 (сколько бы их ни было разделено на лимит) Последний

$xml = simplexml_load_string($rawxml);

foreach ($xml->id as $key => $value) 
{
    $profile           = simplexml_load_file("https://twitter.com/users/$value");
    $friendscreenname  = $profile->{"screen_name"};
    $profile_image_url = $profile->{"profile_image_url"};

    echo "<a href=$profile_image_url>$friendscreenname</a><br>";
}

******Обновить******

if (!isset($_GET['i'])) {
    $i = 0;
} else {
    $i = (int) $_GET['i'];
}

$limit  = $i + 10;
$rawxml = OauthGetFriends($consumerkey, $consumersecret, $credarray[0], $credarray[1]);
$xml    = simplexml_load_string($rawxml);

foreach ($xml->id as $key => $value)
{

    if ($i >= $limit) {
        break;
    }

    $i++;
    $profile           = simplexml_load_file("https://twitter.com/users/$value");
    $friendscreenname  = $profile->{"screen_name"};
    $profile_image_url = $profile->{"profile_image_url"};

    echo "<a href=$profile_image_url>$friendscreenname</a><br>";
}

echo "<a href=step3.php?i=$i>Next 10</a><br>";

Это работает, просто нужно смещать вывод, начиная с $i. Думаете array_slice?


person mrpatg    schedule 05.11.2009    source источник
comment
Об этом много спрашивали - см., Например, stackoverflow.com/questions/163809/ алгоритм умной разбивки на страницы   -  person Dominic Rodger    schedule 05.11.2009
comment
Хавнт нашел то, что искал. Просто примеры того, как это сделать для результатов mysql.   -  person mrpatg    schedule 05.11.2009
comment
Я беспокоюсь, что что-то упустил, почему так важно использовать цикл foreach, когда вы на самом деле не выполняете цикл для каждого элемента?   -  person MalphasWats    schedule 05.11.2009


Ответы (2)


Очень элегантное решение - использование LimitIterator:

$xml = simplexml_load_string($rawxml);
// can be combined into one line
$ids = $xml->xpath('id'); // we have an array here
$idIterator = new ArrayIterator($ids);
$limitIterator = new LimitIterator($idIterator, $offset, $count);
foreach($limitIterator as $value) {
    // ...
}

// or more concise
$xml = simplexml_load_string($rawxml);
$ids = new LimitIterator(new ArrayIterator($xml->xpath('id')), $offset, $count);
foreach($ids as $value) {
    // ...
}
person Stefan Gehrig    schedule 05.11.2009
comment
Я смотрел на это и смотрел на это, но я все еще не понимаю, как это использовать. Для начала, используя приведенный вами пример, начиная с // или более кратко. Где определены $ offset и $ count? Кроме того, откуда берутся видимые ссылки, позволяющие посетителю просматривать данные с разбивкой на страницы? Это очень похоже на то, что я хотел бы сделать (вывод XML на страницы), я просто не знаю, с чего начать использовать предоставленные вами примеры, и если вы не возражаете, обновите свои примеры более полным кодом, я для один был бы очень признателен. - person ; 22.11.2013

Если вы загружаете полный набор данных каждый раз, вы можете сказать об этом довольно прямо и использовать цикл for вместо foreach:

$NUM_PER_PAGE = 20;

$firstIndex = ($page-1) * $NUM_PER_PAGE;

$xml = simplexml_load_string($rawxml);
for($i=$firstIndex; $i<($firstIndex+$NUM_PER_PAGE); $i++)
{
        $profile = simplexml_load_file("https://twitter.com/users/".$xml->id[$i]);
        $friendscreenname = $profile->{"screen_name"};
        $profile_image_url = $profile->{"profile_image_url"};
        echo "<a href=$profile_image_url>$friendscreenname</a><br>";
}

Вам также необходимо ограничить $ i длиной массива, но, надеюсь, вы уловили суть.

person MalphasWats    schedule 05.11.2009