If you have ever needed to set some values of a dictionary in JavaScript or PHP, then you know that you have to do something like myArray[a][b][c] = 0
. But what if we don’t know that the subkeys will be “a->b->c” until runtime? You would need a way to index into the dictionary dynamically and return the resulting modified dictionary. Below are code snippets in JavaScript and PHP that do exactly that.
JavaScript
// Call me like var myNewArray = myArray.deepSetDictionaryValues("a", "b", "c", value); Object.defineProperty(Object.prototype, "deepSetDictionaryValues", { value: function() { arguments = Array.prototype.slice.call(arguments); var value= arguments[arguments.length - 1]; arguments = arguments.slice(0,-1); var o = this; var returner = o; for (var i = 0; i < arguments.length - 1; i++) { var n = arguments[i]; if (n in o) { o = o[n]; } else { o[n] = {}; o = o[n]; } } var n = arguments[arguments.length - 1]; o[n] = value; return returner; }, enumerable: false });
PHP
/* * Call me like $myNewArray = deepSetDictionaryValues($myArray, ["a","b","c"], $value); */ public static function deepSetDictionaryValues($dict, $keyHierarchy, $value){ $o = &$dict; for($i = 0; $i < count($keyHierarchy) - 1; $i++){ $subKeyAtI = $keyHierarchy[$i]; if(array_key_exists($subKeyAtI, $o)){ $o = &$o[$subKeyAtI]; } else{ $o[$subKeyAtI] = []; $o = &$o[$subKeyAtI]; } } $o[$keyHierarchy[count($keyHierarchy) - 1]] = $value; return $dict; }
Leave a Reply