Jump to content

Multinational Array


Tunday

Recommended Posts

First you have a multi-dimensional array, an array or arrays.  In your case the first array is indexed.  So you can deal with that array using a for loop.  The array inside the indexed array is associative, so you can deal with that array using the foreach.

 

Using for outer/inner looping construct:

for ($i=0;$i>=count($Array);$i++) { // loop through each indexed array
   foreach ($Array[$i] as $key=>$value) { // loop through each associative array
      $Url = ($value == $string) ? $Array[$i]['Uri'] : null; // assign url to variable if $string is thumbnail
   }
} 
Link to comment
Share on other sites

 

First you have a multi-dimensional array, an array or arrays.  In your case the first array is indexed.  So you can deal with that array using a for loop.  The array inside the indexed array is associative, so you can deal with that array using the foreach.

 

Using for outer/inner looping construct:

for ($i=0;$i>=count($Array);$i++) { // loop through each indexed array
   foreach ($Array[$i] as $key=>$value) { // loop through each associative array
      $Url = ($value == $string) ? $Array[$i]['Uri'] : null; // assign url to variable if $string is thumbnail
   }
} 

First, you can deal with any array using a foreach

Second - nesting loops is detrimental to performance, especially when you don't break out properly when the desired point is reached.  Instead of iterating through to top level arrays and checking values within them you are suggesting that the OP could improve performance by iterating trough all 16 array entries even if the value is found first check.  That's just nonsense.

Link to comment
Share on other sites

there is no way that running that code should take 9 seconds unless your doing it on a 386. either you're not giving all the info or something somewhere is seriously wrong with your setup.

 

There can be up to 10 values in the array list. I only included two for my example.

Link to comment
Share on other sites

First, you can deal with any array using a foreach

Second - nesting loops is detrimental to performance, especially when you don't break out properly when the desired point is reached.  Instead of iterating through to top level arrays and checking values within them you are suggesting that the OP could improve performance by iterating trough all 16 array entries even if the value is found first check.  That's just nonsense

Okay, you could shorten the process with this modification.  It only evaluates one element of the associative array.

for ($i=0;$i>=count($Array);$i++) { // loop through indexed array
   $Url = ($Array[$i]['Purpose'] == $string) ? $Array[$i]['Uri'] : null; // assign url to variable if $string is thumbnail
} 
Edited by rwhite35
Link to comment
Share on other sites

So I am currently using: https://xboxapi.com/

 

My aim to get the game image image of a users played game.

foreach($xbox360Games['titles'] as $val) { //This Loop gets all xbox360 games from a userid


		if ($val['currentGamerscore'] > 0 ){ //this rules out non game appes iplayer,twitch etc
		
			$xbox360Games = getGameInfo(dechex($val['titleId'])); 
//GetGameInfo is a fuction which will return the array for each game as listed in my original post
			
			foreach($xbox360Games['Items'][0]['Images']as $val2) {
			
				
				if ($val2['Purpose'] == "BoxArt" && $val2['Height'] ==   300) { 
				
					$url = $val2['Url'];
					$htmlxbox .=  "<img src=\" $url  \"  title= Current Game Score:".    $val['currentGamerscore'] . ">";
					break;

				}

			}
		}	
	
	}	
Edited by Tunday
Link to comment
Share on other sites


foreach($xbox360Games['titles'] as $val) {
// ...
  $xbox360Games = getGameInfo(dechex($val['titleId']));  //Don't create a new $xbox360Games here, you're wiping out the original array that you're looping over above!
}
Link to comment
Share on other sites

foreach($xbox360Games['titles'] as $val) {
// ...
  $xbox360Games = getGameInfo(dechex($val['titleId']));  //Don't create a new $xbox360Games here, you're wiping out the original array that you're looping over above!
}

 

 

I agree. However, I do not reuse the top level $xbox360Games again inside the loop.

Link to comment
Share on other sites

I agree. However, I do not reuse the top level $xbox360Games again inside the loop.

I disagree :)

 

Here, you break out of the 2nd loop ONLY if the condition passes, which returns you to the original first loop where you have already overridden the original array. If the condition never passes in the 2nd loop, it also returns to the first original loop.

if ($val2['Purpose'] == "BoxArt" && $val2['Height'] == 300) {
  $url = $val2['Url'];
  $htmlxbox .= "<img src=\" $url \" title= Current Game Score:". $val['currentGamerscore'] . ">";
  break;
}
Link to comment
Share on other sites

 

I disagree :)

 

Here, you break out of the 2nd loop ONLY if the condition passes, which returns you to the original first loop where you have already overridden the original array. If the condition never passes in the 2nd loop, it also returns to the first original loop.

if ($val2['Purpose'] == "BoxArt" && $val2['Height'] == 300) {
  $url = $val2['Url'];
  $htmlxbox .= "<img src=\" $url \" title= Current Game Score:". $val['currentGamerscore'] . ">";
  break;
}

 

Sorry I don't understand this fully.

 

This if statement will always be true. As every game has a Box Art image with height of 300. 

 

Since the 2nd loop is indented and I have begun the loop I don't think I am overwriting $xbox360Games.

 

I have now changed this variable in the 2nd loop as I am confusing myself now :(.

 

Also, Please can some help me with the sleep of this algorithm as I am still experiencing upto 9 seconds for each cycle in the 2nd loop.

 

Thanks

Link to comment
Share on other sites

Cant use in_array since this does not work on multi dimensional arrays.

 

I found the reason for my code taking a while. For each image I want to display and am sending one http request. So If I want to get 9 images I send 9 http requests.

 

Hard to say if this is directly related to my internet connection or code. will try to test  on another network and compare the speeds

Link to comment
Share on other sites

Unless the images are enormous, 9 seconds overall is still a ridiculously long load time.

 

Also, note that Zane isn't using in_array on a multidimensional array, he's using it on $val['Purposes'], which is a simple indexed array. It just so happens that the indexed array 'Purpose' happens to be contained within another array.

Link to comment
Share on other sites

Hi All,

 

Thanks for your support on this. I can confirm the issue is to do with me sending many http request on average it will take 1s for me to send and read a http request.

 

I am currently using curl and need to because I am adding a key which allows me to use the api. I am unable to insert the key thus unable to compare speeds with file_get_content.

 

Currently working on a cache system for the data.

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.