Update FlatArrayTrait.php

Made some speed improvements at the cost of memory and key validation. All defined tests should still work though.
This commit is contained in:
Joby Elliott 2022-01-12 18:11:09 -07:00 committed by GitHub
parent 61d24eb3e8
commit a82b9e1052
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1,10 +1,12 @@
<?php <?php
/* Flatrr | https://gitlab.com/byjoby/flatrr | MIT License */ /* Flatrr | https://gitlab.com/byjoby/flatrr | MIT License */
namespace Flatrr; namespace Flatrr;
trait FlatArrayTrait trait FlatArrayTrait
{ {
private $_arrayData = array(); private $_arrayData = array();
private $_flattenCache = array();
public function push(?string $name, $value) public function push(?string $name, $value)
{ {
@ -64,7 +66,8 @@ trait FlatArrayTrait
return $this->flattenSearch($name); return $this->flattenSearch($name);
} }
function unset(?string $name) { function unset(?string $name)
{
$this->flattenSearch($name, null, true); $this->flattenSearch($name, null, true);
} }
@ -148,7 +151,17 @@ trait FlatArrayTrait
*/ */
protected function flattenSearch(?string $name, $value = null, $unset = false) protected function flattenSearch(?string $name, $value = null, $unset = false)
{ {
if ($value !== null || $unset) {
$this->_flattenCache = array();
}
if (!isset($this->_flattenCache[$name])) {
$this->_flattenCache[$name] = $this->doFlattenSearch($name, $value, $unset);
}
return $this->_flattenCache[$name];
}
protected function doFlattenSearch(?string $name, $value = null, $unset = false)
{
//check for home strings //check for home strings
if ($name == '' || $name === null) { if ($name == '' || $name === null) {
if ($unset) { if ($unset) {
@ -158,23 +171,24 @@ trait FlatArrayTrait
} }
return $this->_arrayData; return $this->_arrayData;
} }
//validate
if (substr($name, -1, 1) == '.' || substr($name, 0, 1) == '..' || strpos($name, '..') !== false) {
return null;
}
//build a reference to where this name should be //build a reference to where this name should be
$parent = &$this->_arrayData; $parent = &$this->_arrayData;
$name = explode('.', $name); $name = explode('.', $name);
$key = array_pop($name); $key = array_pop($name);
foreach ($name as $part) { if ($value !== null) {
if (!isset($parent[$part])) { foreach ($name as $part) {
if ($value !== null) { if (!isset($parent[$part])) {
$parent[$part] = array(); $parent[$part] = array();
} else { }
$parent = &$parent[$part];
}
} else {
foreach ($name as $part) {
if (!isset($parent[$part])) {
return null; return null;
} }
$parent = &$parent[$part];
} }
$parent = &$parent[$part];
} }
//now we have a ref, see if we can unset or set it //now we have a ref, see if we can unset or set it
if ($unset) { if ($unset) {