2013-06-26 5 views
0

У меня есть массив сообщений, которые я хочу отсортировать - но прежде чем я это сделаю, я хочу найти id сообщения с наибольшим количеством likes.find id of post с наибольшим значением

Я петлю через массив, используя foreach. Хотя это кажется пустой тратой для выполнения двух циклов foreach для этого - я не знаю, есть ли альтернатива, когда вы пытаетесь найти самое высокое значение заранее?

Array 
(
    [0] => Array 
     (
      [id] => 162 
      [like_count] => 2 
      etc. 
     ) 
    [1] => Array 
     (
      [id] => 165 
      [like_count] => 23 
      etc. 
     ) 

) 

Так второй пост имеет наибольшее количество подобных, так что мне нужно идентификатор 165 - тогда, когда я Переберите я могу сделать что-то вроде

foreach ($posts as $post){ 
    if($most_liked_id == $post["id"]){ 
     // this post is the most liked! 
    } 
} 

Любая помощь будет высоко ценится - благодаря!

+0

Что вы имеете в виду, две петли foreach? –

ответ

1
$highest = 0; 
$highest_id = 0; 

foreach($array as $a) { 

    if($a['like_count'] > $highest) { 

     $highest = $a['like_count']; 
     $highest_id = $a['id']; 
    } 
} 

Надежда я правильно вас понял :)

+0

Выбрал это как ответ, это самый чистый и самый простой способ. :) Спасибо @paranoid. – Tim

+0

О, и он не перестраивает массив из исходного SQL-запроса, который я использую для сортировки данных. – Tim

0

Это похоже на данные, полученные из базы данных. Если это так, используйте предложение ORDER BY like_count DESC в SQL.

Идентификатор сообщения с наибольшим количеством понравившихся будет затем в $posts[0]['id'], прежде чем сортировать по другому методу.

0

очень простая задача, вы проходите через свои сообщения.

function get_max_like_post($posts) { 
    $max_like = 0; 
    $max_like_post = array(); 
    foreach ($posts as $post) { 
     if ($post['like_count'] > $max_like) { 
      $max_like = $post['like_count']; 
      $max_like_post = $post; 
     } 
    } 

    return $max_like_post['id'] 
    } 
0

Вы можете использовать usort.

$posts = array(
    array('id' => 161, 'like_count' => 0), 
    array('id' => 162, 'like_count' => 6), 
    array('id' => 4, 'like_count' => 2), 
); 

function like_sort($a, $b) { 
    if ($a['like_count'] == $b['like_count']) { 
     return 0; 
    } 
    return ($a['like_count'] > $b['like_count']) ? -1 : 1; 
} 
usort($posts, 'like_sort'); 

// The first element in the array is now the one with the highest like_count. 
echo $posts[0]['id']; // 162 
+0

Спасибо, это отлично работает, но я не хочу перестраивать массив, потому что его порядок определяется чем-то другим. – Tim

+0

Если вы хотите сохранить заказ на использование массива в его первоначальной форме позже, я полагаю, вы всегда можете его скопировать сначала ($ posts_ordered = $ posts). Но (в моем примере), если $ posts имеет какой-то приличный размер, мы начинаем становиться довольно неэффективными, а другие предлагаемые решения лучше. – rebroken

0

Попробуйте это:

usort($posts, function($item) { return -$item['like_count']; }); 
$id = empty($posts) ? null : $posts[0]['id']; 

Где $posts находится массив ввода.

Объяснение:

  • сначала сортировать сообщения, как кол в убывающих модах
  • тогда вы получите верхний идентификатор сообщения, если есть какая-либо должность, нуль в противном случае.

Что хорошего в этом решении - то, что вы также можете выбрать в первую очередь n сообщений.

0
$highest_post_likes = 0; 
$highest_post_id = 0; 
for($i = 0; $i < sizeof($posts); $i++) { 
    if ($posts[$i][like_count] > $highest_post_likes) { 
     $highest_post_likes = $posts[$i][like_count]; 
     $highest_post_id = $i; 
    } 
} 

// now you can use $posts[$highest_post_id] 
0

Вы можете использовать max функцию, чтобы получить наибольшее значение любит:

 foreach ($posts as $post){ 
     $max[]=$post['like_count']; 
    } 

echo max($max['id']); 
+0

Спасибо, хотя это не возвращает 'id' сообщения, которое имеет наибольшее значение. – Tim

+0

Проверьте мой обновленный ответ. Упование это сработает для вас –

0

те, Данные пришли из базы данных, как MySQL? Если это так, самым простым решением является «ORDER BY».

Вы также можете сделать отдельный массив «like_count», сохраняя тот же ключ, что и ваш первый массив, и делаете асорт (http://www.php.net/manual/fr/function.asort.php). У вас будет ключ наивысшего значения.

0

Вы можете отсортировать массив по убыванию в зависимости от like_count, а затем получить id для первого элемента массива.