Me está costando mucho intentar actualizar los valores de mi matriz. Hice un ejemplo simple para ilustrar esto: la matriz contiene los nombres de los jugadores y la cantidad de puntos que tienen. Después de cada ronda quiero actualizar sus puntos así:
(que no funciona)
$players = array ( array ( "id" => 0, "name" => "John", "points" => 0 ), array ( "id" => 1, "name" => "Chris", "points" => 0 ), array ( "id" => 2, "name" => "Peter", "points" => 0 ), array ( "id" => 3, "name" => "Greg", "points" => 0 ), ); $points0 = 10; $points1 = 20; $points2 = 30; $points3 = 40; $i = 0; foreach ($players as $player) { if ($player["id"] == $i) { $player["points"] = ${"points".$i}; } $i++; } var_dump($players);Debe ser algo estúpido, pero llevo horas intentándolo y no lo encuentro.
¡Gracias por la ayuda!
Debe agregar una referencia a $player :
$players = array ( array ( "id" => 0, "name" => "John", "points" => 0 ), array ( "id" => 1, "name" => "Chris", "points" => 0 ), array ( "id" => 2, "name" => "Peter", "points" => 0 ), array ( "id" => 3, "name" => "Greg", "points" => 0 ), ); $points0 = 10; $points1 = 20; $points2 = 30; $points3 = 40; $i = 0; foreach ($players as &$player) { if ($player["id"] == $i) { $player["points"] = ${"points".$i}; } $i++; } La parte crucial es el ampersand & en la instrucción foreach . Sin él, no está registrando ningún cambio en la matriz.
Parece que le gustaría hacer eso usando un bucle. Si ese es el caso, es posible que desee considerar cambiar la variable $points a una matriz como lo demuestra el código a continuación:
<?php $players = array ( array ( "id" => 0, "name" => "John", "points" => 0 ), array ( "id" => 1, "name" => "Chris", "points" => 0 ), array ( "id" => 2, "name" => "Peter", "points" => 0 ), array ( "id" => 3, "name" => "Greg", "points" => 0 ), ); // IF YOU INTEND TO ASSIGN THE VALUES USING A LOOP, IT IS SUGGESTED TO // RATHER MAKE $points AN ARRAY WITH EACH KEY CORRESPONDING TO THE KEY OF THE // MULTIDIMENSIONAL ARRAY $players AND THE VALUE BEING THE POINT TO BE ASSIGNED // TO THE SUB-ARRAY WITH THAT KEY LIKE SO: $points = [ 0 => 10,//IMPLIES: TARGET $players[0] & ADD 10 TO ITS points ITEM: "John" 1 => 20,//IMPLIES: TARGET $players[1] & ADD 20 TO ITS points ITEM: "Chris" 2 => 30,//IMPLIES: TARGET $players[2] & ADD 30 TO ITS points ITEM: "Peter" 3 => 40,//IMPLIES: TARGET $players[3] & ADD 40 TO ITS points ITEM: "Greg" ]; // NOW LOOP THROUGH THE $players MULTIDIMENSIONAL ARRAY... // AS YOU ITERATE THROUGH IT, TRY TO OBTAIN THE POINTS FROM THE $points ARRAY // USING THE LOOP INDEX ($key).... // IT IS ALSO IMPORTANT TO WORK WITH EACH PLAYER BY REFERENCE // USING THE & OPERATOR foreach ($players as $key=>&$player) { // NOTICE THE &$player here $currentPlayersPoints = $points[$key]; // HAVING OBTAINED THE CURRENT PLAYER'S POINTS, // SIMPLY ADD THE VALUE TO THE THE ORIGINAL points ELEMENT $player['points'] += (int)$currentPlayersPoints; } // CHECK OUT YOUR RESULT:: var_dump($players); // YIELDS: array (size=4) 0 => array (size=3) 'id' => int 0 'name' => string 'John' (length=4) 'points' => int 10 1 => array (size=3) 'id' => int 1 'name' => string 'Chris' (length=5) 'points' => int 20 2 => array (size=3) 'id' => int 2 'name' => string 'Peter' (length=5) 'points' => int 30 3 => array (size=3) 'id' => int 3 'name' => string 'Greg' (length=4) 'points' => int 40