Search code examples
phparraysnumbersassociative-array

How do I loop through an Array, and remove the key with lowest value


I'm trying to make a program that has different players in an array assigned with random numbers. It is round-based, so every round the players are assigned new random numbers, and the player(s) with the lowest number is removed from the array.

Problem is that when iterating it doesn't remove the player with the lowest number from the array. It does however print out the player with the lowest number, but that's it...

I want it to remove the player or players and display their names each round till there is one left.

I'm new to learning PHP, so my code structure is not the best xd

$players = array(
    
    "Peter" => "0",
    "John" => "0",
    "Harold" => "0",
    "Alexander" => "0",
    "Thor" => "0",
    "Paul" => "0",
    "Jimmy" => "0",
    "Erik" => "0",
    "Donald" => "0",
    "Matthew" => "0"
);

    for($i = 0; $i < count($players); $i++){
    
            echo "<br>" . "<b>Round ". (1 + $i) ."</b><br>";
    
            foreach($players as $key => $value){
               
                //generating random number to value 
                $value = rand(1,50);
               
                asort($players);  
    
                //Assigning each player a random number
                $players[$key]=$value; 
    
    
                $min = min($players);
                 
                array_splice($players,$min));    
                
            }
            
            echo "Player(s) with lowest number is: " .current(array_keys($players, min($players)));
            echo "<br>"
        }

Solution

  • Instead of use for-loop i suggest you to use while like:

    $players = array(
        "Peter" => "0",
        "John" => "0",
        "Harold" => "0",
        "Alexander" => "0",
        "Thor" => "0",
        "Paul" => "0",
        "Jimmy" => "0",
        "Erik" => "0",
        "Donald" => "0",
        "Matthew" => "0"
    );
    $round = 1;
    while (count($players) > 1) {
        echo "<br>" . "<b>Round " . $round . "</b><br>";
    
        foreach ($players as $key => $value) {    
            do {
                $value = rand(1, 50);
            } while(in_array($value, $players));
            $players[$key] = $value;
        }
        $key = array_keys($players, min($players))[0];
        echo "Player(s) with lowest number is: " . $key;
        echo "<br>";
        unset($players[$key]);
        $round++;
    }
    echo '<br>The winner is:'. key($players);
    

    What have I changed?

    • Use while with logic "continue while untile array count is one" (so just the winner
    • Use do-while for generate different number for each player (unique number)
    • find the min() of array then unset it.

    Reference: