galvin Posted August 29, 2012 Share Posted August 29, 2012 I'm perplexed by this, but I'm sure it's something obvious to a smarter person. I have an array called $startersrosterbefore that has lost of football players in it (with info like ranking, position, team, firstname, etc). There are definitely TWO running backs in this array (i.e. two players with a "positionid" equal to "2"). When I run the code below, to grab any Running backs and put them in their own array, it is only keeping the LAST running back it finds, not all of them. Can anyone tell what's wrong? $startingRBsbefore=array(); foreach ($startersrosterbefore as $ID => $row) { if ($row['positionid'] =="2") { $startingRBsbefore[$row['playerid']][ranking]=$row['ranking']; $startingRBsbefore[$row['playerid']][positionid]=$row['positionid']; $startingRBsbefore[$row['playerid']][position]=$row['position']; $startingRBsbefore[$row['playerid']][teamid]=$row['teamid']; $startingRBsbefore[$row['playerid']][nickname]=$row['nickname']; $startingRBsbefore[$row['playerid']][location]=$row['location']; $startingRBsbefore[$row['playerid']][firstname]=$row['firstname']; $startingRBsbefore[$row['playerid']][lastname]=$row['lastname']; } Quote Link to comment https://forums.phpfreaks.com/topic/267727-cycling-through-array-with-foreach-to-create-another-array/ Share on other sites More sharing options...
jcbones Posted August 29, 2012 Share Posted August 29, 2012 Try this: <?php //syntax highlighting $startingRBsbefore = array(); foreach($startersrosterbefore as $ID => $row) { if($row['positionid'] == 2) { $startingRBsbefore[] = $row; } } foreach($startingRBsbefore as $value) { echo implode('<br />',$value); } Don't know why it is only returning the last one, as the code in the OP should work. IF each players id is unique. Quote Link to comment https://forums.phpfreaks.com/topic/267727-cycling-through-array-with-foreach-to-create-another-array/#findComment-1373474 Share on other sites More sharing options...
Psycho Posted August 29, 2012 Share Posted August 29, 2012 I think there are much easier ways to accomplish what you are after. If the original array is produced from a DB query you should be doing this processing when you extract the results from the query instead of processing the data twice. Here's another unneeded complexity, you are assigning each value to a new key of the same name. Just do this: foreach ($startersrosterbefore as $ID => $row) { if ($row['positionid'] =="2") { $startingRBsbefore[$row['playerid']] = $row; } This may put a little more data in the subarray, but much simpler. But, looking at your code, the only way I see that a new record with $row['positionid'] =="2" could overwrite the previous record is if those two records have the same playerid. Please show the two records from the original array where $row['positionid'] =="2". You could do this for debugging purposes [code=php:0]foreach ($startersrosterbefore as $ID => $row) { if ($row['positionid'] =="2") { echo "<pre>" . print_r($row, 1) . "</pre>"; } [/code] Quote Link to comment https://forums.phpfreaks.com/topic/267727-cycling-through-array-with-foreach-to-create-another-array/#findComment-1373475 Share on other sites More sharing options...
galvin Posted August 29, 2012 Author Share Posted August 29, 2012 Your debugging code produces this below (i.e. 2 running backs) so I can't figure out why my code ends up displaying $startingRBsbefore with only ONE RB (i..e. Murray). Johnson is getting overwritten somehow. Array ( [positionid] => 2 [ranking] => 4 [position] => rb [teamid] => 26 [nickname] => Titans [location] => Tennessee [firstname] => Chris [lastname] => Johnson ) Array ( [positionid] => 2 [ranking] => 7 [position] => rb [teamid] => 2 [nickname] => Cowboys [location] => Dallas [firstname] => DeMarco [lastname] => Murray ) in fact, even when I use your more efficient code instead of mine, I get the same result. In other words, this code.... if ($row['positionid'] =="2") { echo "<pre>" . print_r($row, 1) . "</pre>"; } if ($row['positionid'] =="2") { $startingRBsbefore[$row['playerid']] = $row; } Produces this result when $startingRBsbefore is outputted using print_r... Array ( [] => Array ( [positionid] => 2 [ranking] => 7 [position] => rb [teamid] => 2 [nickname] => Cowboys [location] => Dallas [firstname] => DeMarco [lastname] => Murray ) ) Quote Link to comment https://forums.phpfreaks.com/topic/267727-cycling-through-array-with-foreach-to-create-another-array/#findComment-1373538 Share on other sites More sharing options...
PFMaBiSmAd Posted August 29, 2012 Share Posted August 29, 2012 Your print_r output of the $row array doesn't contain a 'playerid' field, so there no way that using $row['playerid'] as an array index would result in anything other than the symptom you have described, only the last set of values being present in the resulting array. Also, you are using code like - if ($row['positionid'] =="2") ... $startingRBsbefore[]. That implies you have a bunch of logic, duplicated for each possible positionid value. You should instead have ONE array, i.e. $before or similarly named, and if you need to group the data by positionid, use that as an array index - $before[$row['positionid']][] = $row; // this will make a primary array with all the 2's (RB), 3's, 4's grouped together. The key for each $row sub-array will just increment, starting at zero. If you want/need to access the data by both positionid and the playerid, you would use - $before[$row['positionid']][$row['playerid']] = $row; // this will make a primary array as above, with the key for each $row sub-array being the playerid. Quote Link to comment https://forums.phpfreaks.com/topic/267727-cycling-through-array-with-foreach-to-create-another-array/#findComment-1373550 Share on other sites More sharing options...
galvin Posted August 29, 2012 Author Share Posted August 29, 2012 I figured there was an easier way. Let's say I'm originally querying my database with this... $sql = "SELECT * from players"; $startrosterbefore = mysql_query($sql, $connection); if (!$startrosterbefore) { die("Database query failed: " . mysql_error()); } else { $before=array(); while ($row = mysql_fetch_assoc($startrosterbefore)) { $before[$row['positionid']][$row['playerid']] = $row; } Is that what you mean? If I do that, I get an empty array so I'm obviously missing something in terms of building the original array. I think I get it that once I build the original array, I'll be able to access info about different positions easily because of the indexes. I just am not building it properly I guess. Quote Link to comment https://forums.phpfreaks.com/topic/267727-cycling-through-array-with-foreach-to-create-another-array/#findComment-1373567 Share on other sites More sharing options...
PFMaBiSmAd Posted August 29, 2012 Share Posted August 29, 2012 Do you have php's error_reporting set to E_ALL and display_errors set to ON, because when I run the code you just posted (with a } added to close the else { statement), on a table I have with positionid and playerid, I get a $before array that looks like - Array ( [17] => Array ( [1] => Array ( [id] => 1 [playerid] => 1 [teamid] => 1 [positionid] => 17 [jersey_no] => 2 [start_date] => 2012-08-10 [end_date] => 9999-12-31 ) [2] => Array ( [id] => 2 [playerid] => 2 [teamid] => 1 [positionid] => 17 [jersey_no] => 4 [start_date] => 2012-08-10 [end_date] => 9999-12-31 ) [3] => Array ( [id] => 3 [playerid] => 3 [teamid] => 1 [positionid] => 17 [jersey_no] => 14 [start_date] => 2012-08-10 [end_date] => 9999-12-31 ) <snip there are many players with position id 17> [18] => Array ( [5] => Array ( [id] => 5 [playerid] => 5 [teamid] => 1 [positionid] => 18 [jersey_no] => 31 [start_date] => 2012-08-10 [end_date] => 9999-12-31 ) [6] => Array ( [id] => 3043 [playerid] => 6 [teamid] => 1 [positionid] => 18 [jersey_no] => 38 [start_date] => 2012-08-28 [end_date] => 9999-12-31 ) [7] => Array ( [id] => 7 [playerid] => 7 [teamid] => 1 [positionid] => 18 [jersey_no] => 45 [start_date] => 2012-08-10 [end_date] => 9999-12-31 ) [8] => Array ( [id] => 8 [playerid] => 8 [teamid] => 1 [positionid] => 18 [jersey_no] => 33 [start_date] => 2012-08-10 [end_date] => 9999-12-31 ) [9] => Array ( [id] => 9 [playerid] => 9 [teamid] => 1 [positionid] => 18 [jersey_no] => 46 [start_date] => 2012-08-10 [end_date] => 9999-12-31 ) <snip> ... [5] => Array ( [1434] => Array ( [id] => 1434 [playerid] => 1434 [teamid] => 16 [positionid] => 5 [jersey_no] => 77 [start_date] => 2012-08-10 [end_date] => 9999-12-31 ) [2179] => Array ( [id] => 2960 [playerid] => 2179 [teamid] => 29 [positionid] => 5 [jersey_no] => -- [start_date] => 2012-08-19 [end_date] => 2012-08-28 ) [2735] => Array ( [id] => 2735 [playerid] => 2735 [teamid] => 30 [positionid] => 5 [jersey_no] => 71 [start_date] => 2012-08-10 [end_date] => 9999-12-31 ) [3015] => Array ( [id] => 3040 [playerid] => 3015 [teamid] => 29 [positionid] => 5 [jersey_no] => 70 [start_date] => 2012-08-24 [end_date] => 9999-12-31 ) ) ) The only changes I made to your code is my table name is player_details and I didn't use an explicit $connection variable in the mysql_query() statement. Quote Link to comment https://forums.phpfreaks.com/topic/267727-cycling-through-array-with-foreach-to-create-another-array/#findComment-1373574 Share on other sites More sharing options...
galvin Posted August 29, 2012 Author Share Posted August 29, 2012 Nope just had another variable called "$before" in between creating the array and outputting it that was screwing things up (very sorry about that). So yes, I now get what you get. And while I assume there are always exceptions, in general, you're saying I should be able to use this single array to get any of the "Player" table info I want by using either their position or player id (without having to create new arrays for each position), correct? Thanks again, your answers are always so helpful/insightful. Quote Link to comment https://forums.phpfreaks.com/topic/267727-cycling-through-array-with-foreach-to-create-another-array/#findComment-1373577 Share on other sites More sharing options...
PFMaBiSmAd Posted August 29, 2012 Share Posted August 29, 2012 The array will let you access information by positionid - $before[2] will be an array of arrays of all the RBs, where the index of the subarray is the playerid and the subarray data is that player's record ($row.) You can either access a specific player - $before[2][some_playerid] (will be the $row data) or by element - $before[2][some_playerid]['firstname' ] or you could iterate over all the RB's - foreach($before[2] as $playerid => $row){ } You can also iterate over all the positionids, then all the playerids under each postionid - foreach($before as $positionid => $arr){ foreach($arr as $playerid=>$row){ } } Quote Link to comment https://forums.phpfreaks.com/topic/267727-cycling-through-array-with-foreach-to-create-another-array/#findComment-1373586 Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.