Попытка отсортировать мой результат цикла foreach на postcount - PullRequest
0 голосов
/ 26 июня 2019

Попытка отсортировать лучшие постеры по количеству постов, полученных из Invision Powerboard API (программное обеспечение форума).Не могу понять, как отсортировать это эхо моего цикла foreach.

$curl = curl_init( $communityUrl . '/core/members/' );
curl_setopt_array( $curl, array(
    CURLOPT_RETURNTRANSFER  => TRUE,
    CURLOPT_HTTPAUTH    => CURLAUTH_BASIC,
    CURLOPT_USERPWD     => "{$apiKey}:"
    ) );
$response = curl_exec( $curl );
$data = json_decode($response, true);
$count = 0;
foreach($data as $member) {     
    if (is_array($member)) {
        foreach($member as $name) { 
            if($count > 4) 
                return;
            echo '<p class="top-member-p"><a href="'.$name['profileUrl'].'">'.ucfirst($name['name']).'</a> has '.$name['posts'] . ' posts</p>';
            $count++;
        }
    }
}

Я ожидаю, что результат будет отсортирован по их количеству сообщений примерно так:

"Swaghetti has 34 posts"<br>
"Josh has 15 posts"<br>
"Test has 3 posts"<br>
"Testuser2 has 0 posts"

Но вместо этоговыглядит так:

"Swaghetti has 34 posts"<br>
"Testuser2 has 0 posts"<br>
"Test has 3 posts"<br>
"Josh has 15 posts"

1 Ответ

4 голосов
/ 26 июня 2019

Если у вас нет другого способа восстановить отсортированные данные, вы можете сделать это самостоятельно - используя usort() - что сортируется по вашей собственной функции. Сравните с другими значениями posts и поместите их соответственно в массив (верните 1, если он должен быть перемещен вверх, -1, если он должен быть перемещен вниз).

Я также добавил array_slice() in, так как вы, кажется, хотите только первые 4 элемента (таким образом, вы получаете только те, и вам не нужен счетчик).

// Test-data, I guessed my way to your format to match the output from what you had in the question
$data = [
    [['name' => 'Testuser2', 'posts' => 0, 'profileUrl' => 'swag']],
    [['name' => 'Josh', 'posts' => 15, 'profileUrl' => 'swag']],
    [['name' => 'Test', 'posts' => 3, 'profileUrl' => 'swag']],
    [['name' => 'Swaghetti', 'posts' => 34, 'profileUrl' => 'swag']],
];
// $data = json_decode($response, true);

usort($data, function($a, $b) {
    $a = array_column($a[0], 'posts');
    $b = array_column($b[0], 'posts');
    return ($a < $b) ? -1 : 1;
});

$slieced = array_slice($data, 0, 4);
foreach($slieced as $member) {
    if (is_array($member)) {
        foreach($member as $name) {
            echo '<p class="top-member-p">
                      <a href="'.$name['profileUrl'].'">'.ucfirst($name['name']).'</a> 
                      has '.$name['posts'] . ' posts
                  </p>'."\n";
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...