Skip to content

Instantly share code, notes, and snippets.

@tatat
Last active October 13, 2015 04:57
Show Gist options
  • Save tatat/4142467 to your computer and use it in GitHub Desktop.
Save tatat/4142467 to your computer and use it in GitHub Desktop.
mkdir -p 的な(こういうの便利そう)
<?php
class ArrayDataStore extends ArrayIterator {
protected $separator = '.';
public function set_separator($separator) {
$this->separator = $separator;
return $this;
}
public function get($key, $default = null) {
$parent = $this->get_parent_array($key, $last_ns);
return !is_null($parent) && array_key_exists($last_ns, $parent) ? $parent[$last_ns] : $default;
}
public function has_key($key) {
$parent = $this->get_parent_array($key, $last_ns);
return !is_null($parent) && array_key_exists($last_ns, $parent);
}
public function set($key, $value) {
$parent =& $this->get_parent_array($key, $last_ns, true);
$parent[$last_ns] = $value;
return $this;
}
public function set_default($key, $value) {
$parent =& $this->get_parent_array($key, $last_ns, true);
if (!array_key_exists($last_ns, $parent))
$parent[$last_ns] = $value;
return $this;
}
public function set_defaults(array $defaults) {
foreach ($defaults as $key => $value)
$this->set_default($key, $value);
return $this;
}
public function delete($key) {
$parent =& $this->get_parent_array($key, $last_ns);
if (!is_null($parent) && array_key_exists($last_ns, $parent))
unset($parent[$last_ns]);
return $this;
}
protected function &get_parent_array($key, &$last_ns, $create_if_not_exist = false) {
$current =& $this;
$ns = explode($this->separator, $key);
$last_ns = array_pop($ns);
foreach ($ns as $k) {
if (!array_key_exists($k, $current) || !is_array($current[$k])) {
if ($create_if_not_exist) {
$current[$k] = array();
} else {
$null = null;
return $null;
}
}
$current =& $current[$k];
}
return $current;
}
}
<?php
$a = new ArrayDataStore();
$a['nyan1'] = 'nyan1';
$a['nyan2'] = array(
'nyan3' => 'nyan3'
);
$a->set('nyan4.nyan5.nyan6', 'nyan6');
$a->set('nyan7.nyan8.nyan9', array(
'nyan10' => 'nyan10'
));
$a->set('nyan7.nyan8.nyan9.nyan11', 'nyan11');
var_dump($a->get('nyan2'));
// array(1) {
// ["nyan3"]=>
// string(5) "nyan3"
// }
var_dump($a->get('nyan4.nyan5.nyan6'));
// string(5) "nyan6"
var_dump($a->get('nyan7.nyan8.nyan9.nyan10'));
// string(6) "nyan10"
var_dump($a->get('nyan7.nyan8.nyan9'));
// array(2) {
// ["nyan10"]=>
// string(6) "nyan10"
// ["nyan11"]=>
// string(6) "nyan11"
// }
var_dump($a->get('opopo.opopo'));
// NULL
var_dump((array) $a);
// array(4) {
// ["nyan1"]=>
// string(5) "nyan1"
// ["nyan2"]=>
// array(1) {
// ["nyan3"]=>
// string(5) "nyan3"
// }
// ["nyan4"]=>
// array(1) {
// ["nyan5"]=>
// array(1) {
// ["nyan6"]=>
// string(5) "nyan6"
// }
// }
// ["nyan7"]=>
// array(1) {
// ["nyan8"]=>
// array(1) {
// ["nyan9"]=>
// array(2) {
// ["nyan10"]=>
// string(6) "nyan10"
// ["nyan11"]=>
// string(6) "nyan11"
// }
// }
// }
// }
foreach ($a as $key => $value)
var_dump($key);
// string(5) "nyan1"
// string(5) "nyan2"
// string(5) "nyan4"
// string(5) "nyan7"
$a->delete('nyan1')
->delete('nyan2')
->delete('nyan4')
->delete('nyan7.nyan8.nyan9.nyan10');
var_dump((array) $a);
// array(1) {
// ["nyan7"]=>
// array(1) {
// ["nyan8"]=>
// array(1) {
// ["nyan9"]=>
// array(1) {
// ["nyan11"]=>
// string(6) "nyan11"
// }
// }
// }
// }
var_dump($a->has_key('nyan7.nyan8.nyan9.nyan10'));
// bool(false)
var_dump($a->has_key('nyan7.nyan8.nyan9.nyan11'));
// bool(true)
var_dump($a->has_key('nyan7.nyan8.nyan9.nyan11.nyan12'));
// bool(false)
var_dump($a->has_key('nyan0'));
// bool(false)
$a->set('nyan0', null);
var_dump($a->has_key('nyan0'));
// bool(true)
$a->delete('nyan0');
var_dump($a->has_key('nyan0'));
// bool(false)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment