2015-04-29 3 views
1

У меня есть переменная с именем $result, которая представляет собой массив, содержащий до 4 элементов. Одним из элементов может быть число или массив, содержащий несколько номеров.php array sort out winners

Первый элемент $result победитель, то второй элемент второй и т.д .. Это может быть несколько победителей, 2-ой, 3-ей победителей и т.д ..

пример:

$result = array(
1, 
2, 
array(3,4) 
); 

OR 

    $result = array(1,2,3); 
OR 
    $result = array(array(1,2),array(1,2)); 
    OR 

    $result = array(1,2,3,4); 
etc.. 

это будет означает, что победитель 1, второй победитель - 2, а theres - 3-е место между 3 и 4. нет 4-го места, так как $result содержит только 3 элемента.

Вопрос: Как хранить победителей быть таким:

$data['winner'] = "The user Xwon"; OR "the user x and y won.. (or even more if there is even more winners somehow)"; 
    // If there is 2nd place 
    do the same with 2nd. 
    // If there is 3rd.. 
    same 
    // If there is 4th. 
same 

так $data может содержать элемент для каждого из победителей, независимо от того, если там несколько победителей для этого или нет встречаемости?

Если у вас есть лучшее решение, поделитесь им.

Краткая информация: Как я могу сделать выход этой переменной лучше?/Наилучшим образом?

Примечание: важно, чтобы весь первый победитель был объявлен в сообщении.

$data['winner'] = "The user Xwon"; OR "the user x and y won.. (or even more if there is even more winners somehow)"; 

это то, что я был до, очень беден сделал:

$winner = $result[0]; 

     $differentWinners = count($result); 


     if (is_array($winner)) { 
      foreach($winner as $player) { 
       echo "winner is: $player <br>"; 
      } 
     } else { 
     //  echo "only winner is: $winner <br>"; 
     } 

     $return['winner']['userid'] = $userIds[$winner]; 
     $return['winner']['username'] = $this->user->userDetails($userIds[$winner])->username; 
     $winnerData = new pokerHand($test[$winner]); 
     $return['winner']['combination'] = $winnerData->printHand()['combination']; 

     $return['winner']['message'] = "THE AMAZING ".$return['winner']['username']." WON WITH ".$return['winner']['combination']." !"; 




     if ($differentWinners == 2) { 

      $secound = $result[1]; 
      if (is_array($secound)) { 
       foreach($secound as $player) { 
        echo "secound is: $player <br>"; 
       } 
      } else { 
       echo "only secound is: $secound <br>"; 
      } 
     } 


     if ($differentWinners == 3) { 
      $third = $result[2]; 
      if (is_array($third)) { 
       foreach($third as $player) { 
        echo "third is: $player <br>"; 
       } 
      } else { 
       echo "only third is: $third <br>"; 
      } 
     } 




     if ($numbers == 4 and $differentWinners == 4) { 
      $forth = $result[3]; 
      if (is_array($forth)) { 
       foreach($forth as $player) { 
        echo "forth is: $player <br>"; 
       } 
      } else { 
       echo "only forth is: $winner <br>"; 
      } 
     } 



    return $return; 
+0

Вы пробовали что-нибудь? – Rizier123

+0

плохой пост, что я пытался. – maria

+0

Итак, где мы с этим вопросом? – Rizier123

ответ

2

Это должно работать для вас:

Здесь я просто пройти через $result массив проверку, если либо массив, либо нормальное число. Затем я добавляю значения в массив $data.

<?php 

    $result = [1,[2,3],4]; 
    $names = ["first", "second", "third", "fourth"]; 


    foreach($result as $k => $v){ 
     if(is_array($v)) { 
      foreach($v as $t) 
       $data["winner"][$names[$k]][] = $t; 
     } else { 
      $data["winner"][$names[$k]][] = $v; 
     } 
    } 

    print_r($data); 

?> 

выход:

Array 
(
    [winner] => Array 
     (
      [first] => Array 
       (
        [0] => 1 
       ) 

      [second] => Array 
       (
        [0] => 2 
        [1] => 3 
       ) 

      [third] => Array 
       (
        [0] => 4 
       ) 

     ) 

) 

И если вы хотите, чтобы напечатать сообщения победителя просто определить сообщение, как это:

$messages = ["first" => "First is user: ", "second" => "Second is user: ", "third" => "Third is user: ", "fourth" => "Fourth is user: "]; 

И затем петлю через $data массив как это:

foreach($data["winner"] as $k => $v) { 
    if(is_array($v)) 
     echo $messages[$k] . implode(" and ", $v) . "<br>"; 
    else 
     echo $messages[$k] . $v . "<br>"; 
} 

выхода:

First is user: 1 
Second is user: 2 and 3 
Third is user: 4 
+0

приятно! но что, если есть более двух победителей? – maria

+0

@maria Попробуйте, он просто отлично работает – Rizier123

+0

@maria Вы пробовали? Это работает для вас? – Rizier123

1

Вот быстрая функция, которая может возвращать результат, который вы просили - идеи были бы проверить, если значение массива является массивом, и если это попы последней записи от и взрываться остальным с разделитель запятой, добавив последний обратно с «и» в качестве разделителя (для вывода 1, 2, 3 and 4).Если это не массив, просто добавьте его как есть, а затем возвращает строку, которую вы просили:

function outputResults($test) { 
    if (is_array($test)) { 
     // Take the last one off so we can use AND as a delimiter 
     $last = array_pop($test); 
     $results = implode(', ', $test) . ' and ' . $last; 
    } else { 
     $results = $test; 
    } 
    return 'The user ' . $results . ' won.'; 
} 

Demo here

+0

rep +! :) пойду в это. – maria