supermerc Posted July 10, 2009 Share Posted July 10, 2009 Could someone explain to me how foreach works? I have a curl script that gets a page then with the page I do a preg_match_all to find some data preg_match_all('~<td style="padding-left:25px;" align="left">Sigil</td>\s*<td><a href="profile\.php\?id=([^"]+)">([^<]*)<~', $data, $matches); I get data in $matches[1] and $matches[2] And I want to do a foreach statement so separate them all so for each pair of 1 and 2 I can do something with them. So if someone could explain me how it works. I tried: foreach($matches as $array) { foreach($array as $match) { and i got weird letters and numbers as my variables and it wasnt the case, then I tried: foreach($matches as $k=>$match) And it got me something else that was weird so if someone could explain it to me so I finally understand how it works it would help a lot. Link to comment https://forums.phpfreaks.com/topic/165510-foreach/ Share on other sites More sharing options...
flyhoney Posted July 10, 2009 Share Posted July 10, 2009 To start, maybe you should do a print_r on your array, that way you can clearly see the structure of the array. Link to comment https://forums.phpfreaks.com/topic/165510-foreach/#findComment-872947 Share on other sites More sharing options...
supermerc Posted July 10, 2009 Author Share Posted July 10, 2009 I did do that Array ( [0] => Array ( [0] => Sigil BabyBrutes< [1] => Sigil PotHunting< [2] => Sigil PotHunting1< [3] => Sigil PotHuntingFIRE< [4] => Sigil PotArcane1< [5] => Sigil PotArcane2< [6] => Sigil PotHoly< [7] => Sigil babykillerv6< [8] => Sigil PotKinetic2< [9] => Sigil PotKinetic< [10] => Sigil PotShadow2< [11] => Sigil PotShadow1< [12] => Sigil PotShadow< [13] => Sigil PotHoly2< [14] => Sigil PotHoly1< [15] => Sigil PotKinetic1< [16] => Sigil bloodyslet< [17] => Sigil Bloodieke< [18] => Sigil Weezer< [19] => Sigil Bruce< [20] => Sigil xKiLLeR13x< [21] => Sigil BabyGovernment< [22] => Sigil BabyCobalt< [23] => Sigil BabyDest< [24] => Sigil BabyLifeforces< [25] => Sigil BabySoulgems< [26] => Sigil BabyNoc< [27] => Sigil babykillerv4< [28] => Sigil babykillerv5< [29] => Sigil BabyCrewstones< ) [1] => Array ( [0] => 22829 [1] => 24039 [2] => 24040 [3] => 24041 [4] => 24044 [5] => 24046 [6] => 24051 [7] => 99876 [8] => 24061 [9] => 24059 [10] => 24057 [11] => 24056 [12] => 24054 [13] => 24053 [14] => 24052 [15] => 24060 [16] => 6380 [17] => 6381 [18] => 6394 [19] => 6396 [20] => 6650 [21] => 10769 [22] => 8407 [23] => 10771 [24] => 10773 [25] => 10775 [26] => 10774 [27] => 99874 [28] => 99875 [29] => 10832 ) [2] => Array ( [0] => BabyBrutes [1] => PotHunting [2] => PotHunting1 [3] => PotHuntingFIRE [4] => PotArcane1 [5] => PotArcane2 [6] => PotHoly [7] => babykillerv6 [8] => PotKinetic2 [9] => PotKinetic [10] => PotShadow2 [11] => PotShadow1 [12] => PotShadow [13] => PotHoly2 [14] => PotHoly1 [15] => PotKinetic1 [16] => bloodyslet [17] => Bloodieke [18] => Weezer [19] => Bruce [20] => xKiLLeR13x [21] => BabyGovernment [22] => BabyCobalt [23] => BabyDest [24] => BabyLifeforces [25] => BabySoulgems [26] => BabyNoc [27] => babykillerv4 [28] => babykillerv5 [29] => BabyCrewstones ) ) Link to comment https://forums.phpfreaks.com/topic/165510-foreach/#findComment-872949 Share on other sites More sharing options...
allenskd Posted July 10, 2009 Share Posted July 10, 2009 To do a foreach you must know the data residing in your arrays therefore you need to start var_dump()ing your array to know the structure. foreach iterates an array, iterates = lets say there are 8 keys with values stored in an array so foreach goes from 0 to 7 (do note that arrays always starts at 0 unless its a custom one) supposing we have $array = array('1','2','3','4'); //The count would be 3 var_dump($array); in an array a key starts with zero (yes I'm repeating myself) So, imagine this 0 = 1 1 = 2 2 = 3 3 = 4 Now when we want to do a foreach foreach($array as $key => $value) { // foreach is a loop that will stop at the end of an array echo "Key: ".$key ".PHP_EOL; echo "Value: ".$value."<br />".PHP_EOL; } Link to comment https://forums.phpfreaks.com/topic/165510-foreach/#findComment-872952 Share on other sites More sharing options...
wildteen88 Posted July 10, 2009 Share Posted July 10, 2009 When using print_r use it like so echo '<pre>'.print_r($matches, true).'</pre>'; This will make the structure of your array more clear. Can you also explain what are trying to do with your code? Link to comment https://forums.phpfreaks.com/topic/165510-foreach/#findComment-872953 Share on other sites More sharing options...
Yesideez Posted July 10, 2009 Share Posted July 10, 2009 As suggested by flyhoney - print_r will show you the structure of the array so you have an idea of what foreach is running through. Let's take a single dimensional array as an example, one containing a list of 5 names (adam, peter, paul, robert, jake) $arrNames=array('adam','peter','paul','robert','jake'); Now we'll use foreach to run through the array sending some text to the browser: foreach ($arrNames as $name) { echo 'Hello '.$name.'<br>'; } As you can see foreach runs through the array passing the elements in turn as $name and is the same as: for ($i=0;$i<count($arrNames);++$i) { echo 'Hello '.$arrNames[$i].'<br>'; } Let's say we have an indexed array - the indexes are the names and the values are their age: $arrAges=array('adam' => 18,'peter' => 21,'paul' => 35,'robert' => 65,'jake' => 14); Now we can use foreach to run through each element accessing the index and value: foreach ($arrAges as $key => $value) { echo $key.' is '.$value.' years old<br>'; } Home that helps. Link to comment https://forums.phpfreaks.com/topic/165510-foreach/#findComment-872954 Share on other sites More sharing options...
thebadbad Posted July 10, 2009 Share Posted July 10, 2009 And I want to do a foreach statement so separate them all so for each pair of 1 and 2 I can do something with them. You can add a fourth parameter to preg_match_all(), PREG_SET_ORDER, to order the subpatterns together in arrays. Then loop through each set: <?php foreach ($matches as $array) { //$array[1] is the grabbed ID //$array[2] is the grabbed corresponding name } ?> Link to comment https://forums.phpfreaks.com/topic/165510-foreach/#findComment-872962 Share on other sites More sharing options...
supermerc Posted July 10, 2009 Author Share Posted July 10, 2009 And I want to do a foreach statement so separate them all so for each pair of 1 and 2 I can do something with them. You can add a fourth parameter to preg_match_all(), PREG_SET_ORDER, to order the subpatterns together in arrays. Then loop through each set: <?php foreach ($matches as $array) { //$array[1] is the grabbed ID //$array[2] is the grabbed corresponding name } ?> Can you elaborate on "You can add a fourth parameter to preg_match_all(), PREG_SET_ORDER, to order the subpatterns together in arrays." PLease Link to comment https://forums.phpfreaks.com/topic/165510-foreach/#findComment-873041 Share on other sites More sharing options...
MatthewJ Posted July 10, 2009 Share Posted July 10, 2009 preg_match_all('~<td style="padding-left:25px;" align="left">Sigil</td>\s*<td><a href="profile\.php\?id=([^"]+)">([^<]*)<~', $data, $matches, PREG_SET_ORDER) Link to comment https://forums.phpfreaks.com/topic/165510-foreach/#findComment-873044 Share on other sites More sharing options...
thebadbad Posted July 10, 2009 Share Posted July 10, 2009 Use preg_match_all('~<td style="padding-left:25px;" align="left">Sigil</td>\s*<td><a href="profile\.php\?id=([^"]+)">([^<]*)<~', $data, $matches, PREG_SET_ORDER); and then use the foreach loop I posted to loop through each set of IDs/names. Edit: Matthew beat me to it.. Link to comment https://forums.phpfreaks.com/topic/165510-foreach/#findComment-873046 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.