SamC Posted February 1, 2018 Share Posted February 1, 2018 Just another general coding question. I've been mucking about with arrays today (made much more enjoyable with movie references...) along with various other things I tried to bake in for added learning. I wanted to ask about what the 'norm' is in PHP regarding modifying an original thing (by reference) or returning something new and working with that (by value). The code is this (just looking at the function and usage immediately after it): Version 1 <?php $json = '{ "Bill": { "first_name": "Bill", "last_name": "Preston", "age": 18, "location": "San Dimas" }, "Ted": { "first_name": "Ted", "last_name": "Logan", "age": 19, "location": "San Dimas" }, "Rufus": { "first_name": "Rufus", "last_name": null, "age": 52, "location": "Futuristic City" } }'; // return array $people = json_decode($json, true); // by reference function changeKey($currentKey, $newKey, &$arr) { if (array_key_exists($currentKey, $arr)) { $arr[$newKey] = $arr[$currentKey]; unset($arr[$currentKey]); } else { // error rather than returning original array throw new Exception("Key does not exist"); } } changeKey("Ted", "Ted Theodore", $people); foreach($people as $person => $arr) { echo "<h1>" . $person . "</h1>"; echo "<ul>"; foreach($arr as $key => $value) { $key = ucfirst(str_replace("_", " ", $key)); if (isset($value)) { echo "<li>" . $key . ": " . $value . "</li>"; } } echo "</ul>"; } Version 2 <?php $json = '{ "Bill": { "first_name": "Bill", "last_name": "Preston", "age": 18, "location": "San Dimas" }, "Ted": { "first_name": "Ted", "last_name": "Logan", "age": 19, "location": "San Dimas" }, "Rufus": { "first_name": "Rufus", "last_name": null, "age": 52, "location": "Futuristic City" } }'; // return array $people = json_decode($json, true); // by value function changeKey($currentKey, $newKey, $arr) { if (array_key_exists($currentKey, $arr)) { $arr[$newKey] = $arr[$currentKey]; unset($arr[$currentKey]); return $arr; } else { // error rather than returning original array throw new Exception("Key does not exist"); } } // assign modified array $people = changeKey("Ted", "Ted Theodore", $people); foreach($people as $person => $arr) { echo "<h1>" . $person . "</h1>"; echo "<ul>"; foreach($arr as $key => $value) { $key = ucfirst(str_replace("_", " ", $key)); if (isset($value)) { echo "<li>" . $key . ": " . $value . "</li>"; } } echo "</ul>"; } Both cases output: Bill - First name: Bill - Last name: Preston - Age: 18 - Location: San Dimas Rufus - First name: Rufus - Age: 52 - Location: Futuristic City Ted Theodore - First name: Ted - Last name: Logan - Age: 19 - Location: San Dimas So is there a preference? Thanks. 1 Link to comment Share on other sites More sharing options...
bernhard Posted February 1, 2018 Share Posted February 1, 2018 https://stackoverflow.com/questions/5479073/when-is-it-good-to-use-pass-by-reference-in-php https://www.elated.com/articles/php-references/ So I think you have to decide on your own taking into account performance and code readability. 2 1 Link to comment Share on other sites More sharing options...
SamC Posted February 1, 2018 Author Share Posted February 1, 2018 Great links, really cleared things up, thanks @bernhard. 1 Link to comment Share on other sites More sharing options...
FrancisChung Posted February 3, 2018 Share Posted February 3, 2018 @SamC Slightly off topic, but here's a good one for JS.http://www.leerichardson.com/2015/02/an-illustrated- gude-to-parameter.html P/S : the spelling mistake in the URL is as is. As you learn other languages, this is another area where there might be subtle differences between languages that could come back and bite you. (e.g. Java only does pass by value) 3 1 Link to comment Share on other sites More sharing options...
SamC Posted February 3, 2018 Author Share Posted February 3, 2018 Thanks @FrancisChung I'll read that later this weekend (after the rugby of course!). I'm working on OOP php at the moment. Been creating classes and objects (using public/abstract/interface), extending them, implementing them, redefining functions, using constructors, working out the differences between public/private/protected/final properties/methods. Having a blast! I'll be off the bench and in the game one day! This does mean my MySQL chapter has been put on the back burner for now though... was getting bored with it tbh, just working in mysql workbench, create, alter, insert, delete, repeat, repeat again. It's important though so I'll go back to that soon enough. Link to comment Share on other sites More sharing options...
Recommended Posts