Re-map key/value array data in PHP Re-map key/value array data in PHP

I was recently tasked with a situation where I needed to populate about 10 different "Settings" for every user in the current database.

This example is specifically for CakePHP, however, it could easily be used elsewhere.� My goal was the following, I had an array that was key value paired as follows:

array(

�[0] => array(

��'User' => array(

���'id' => 1)

��),

�[1] => array(

��'User' => array(

���'id' => 2)

��),

�[2] => array(

��'User' => array(

���'id' => 3)

��),

�[3] => array(

��'User' => array(

���'id' => 4)

��),

)

The result I needed was as follows:

array(

�[0] => array(

��'UserSetting' => array(

���'user_id' => 1)

��),

�[1] => array(

��'UserSetting' => array(

���'user_id' => 2)

��),

�[2] => array(

��'UserSetting' => array(

���'user_id' => 3)

��),

�[3] => array(

��'UserSetting' => array(

���'user_id' => 4)

��),

)

With a few simple lines of code, I was able to quickly and easily achieve this, let me show you how.


First, let me explain that I was dealing with over 100,000 users and I did not want to do a straight loop and update.� I felt too much processing time and memory would be used for this to work well on a production server that was very active.

Instead, using the array_map() function and a custom function performed this process for me extremely quickly and efficiently.

Below is my sample code that I created to test out my function:

...
// get all user ids
$this->User->recursive = -1;
$users = $this->User->find('all', array('fields'=>'id', 'limit' => 10));
$tmp = array_map(array(&$this, 'fix_element'), $users);
var_dump($tmp);
...
function fix_element($elem) {
�return array("UserSetting" => array("user_id" => $elem['User']['id']));
}

The above code passes in the $users array to the fix_element() function that I created.� The whole thing with the &$this is needed because this is inside a CakePHP controller.

The fix_element() function is called once for each element in the array.� I know I know, I said I didn't want to loop through each element, the key to that statement, is that I didn't want to.� I'm letting PHP do it, which is a lot faster than a foreach statement.

The function replaces $elem['User']['id'] with $elem['UserSetting']['user_id'], exactly the result I wanted.

My finish product loops through an array of my 10 different user settings and adds my other keys for my UserSetting array and I call a saveAll() with my entire array of users, once for each setting.

I don't remember exactly how long the code took to run, but it saved over 1,000,000 records in under 5 minutes, probably around the 2 or 3 minute range.

Published on Mar 19, 2009

Tags: CakePHP Tutorial | PHP

Related Posts

Did you enjoy this article? If you did here are some more articles that I thought you will enjoy as they are very similar to the article that you just finished reading.

Tutorials

Learn how to code in HTML, CSS, JavaScript, Python, Ruby, PHP, Java, C#, SQL, and more.

No matter the programming language you're looking to learn, I've hopefully compiled an incredible set of tutorials for you to learn; whether you are beginner or an expert, there is something for everyone to learn. Each topic I go in-depth and provide many examples throughout. I can't wait for you to dig in and improve your skillset with any of the tutorials below.