Здравствуйте, уважаемые Знающие люди. Простите если я не туда разместил свой вопрос — делаю это впервые.
Вот я создал класс, который позволяет, как мне кажется, удобнее работать со списками данных. Удобство заключается в том, что объект в большинстве методов возвращает сам себя, что позволяет далее с ним играть. Используя Zend for Eclipse и комментарии к методам return asList я получаю кайф при работе со списками данных. Пример:
Возвращает:
Для javascript это нормально когда объект возвращает сам себя, но по какой-то странной причине я не смог обнаружить в том же google подобных классов на PHP. Это заставило задуматься может я чего-то не так делаю? Может такая реализация имеет большой проигрыш по скорости или ест много ресурсов? Вопрос к специалистам, стоит ли использовать такой подход (и кстати, как он правильно называется?)
Ниже идёт код класса.
Вот я создал класс, который позволяет, как мне кажется, удобнее работать со списками данных. Удобство заключается в том, что объект в большинстве методов возвращает сам себя, что позволяет далее с ним играть. Используя Zend for Eclipse и комментарии к методам return asList я получаю кайф при работе со списками данных. Пример:
$obj = new asList;
print_r( $obj->
set(array("my"=>"lol","dear"=>"rofl","mom"=>"hehe"))->
intersect("hello,my,dear,friend")->
merge("test,yo")->
fillValuesFrom(array("yo"=>"good test"))->
asArray()
);Возвращает:
Array ( [my] => [dear] => [test] => [yo] => good test )
Для javascript это нормально когда объект возвращает сам себя, но по какой-то странной причине я не смог обнаружить в том же google подобных классов на PHP. Это заставило задуматься может я чего-то не так делаю? Может такая реализация имеет большой проигрыш по скорости или ест много ресурсов? Вопрос к специалистам, стоит ли использовать такой подход (и кстати, как он правильно называется?)
Ниже идёт код класса.
<?php
/**
* Associative List class
*
*/
class asList {
private $_data;
/**
* New associative list
*
* @param array||string $data (optional)
* @param string $clue (optional), if $data type == string
*/
function __construct($data = NULL, $clue = ",") {
if (! is_null ( $data )) $this->set ( $data, $clue );
}
/**
* Private function to convert array||string to array
*
* @param array||string $array_or_string
* @param string (optional) $clue
* @return array
*/
private function _toArray($array_or_string, $clue = ",") {
if (is_array ( $array_or_string )) {
$array = $array_or_string;
} elseif (is_string($array_or_string)) {
$array_or_string = trim ( $array_or_string, $clue . " " );
$keys = @explode ( $clue, $array_or_string );
$array = array_fill_keys ( $keys, '' );
}
if (!is_array($array)) $array = array();
unset ( $array [""] ); //data[] not allowed
return $array;
}
/**
* Set data to work with
*
* @param arr||str $array_or_string
* @param string $clue
* @return asList
*/
public function set($array_or_string, $clue = ",") {
$array = $this->_toArray ( $array_or_string, $clue );
$this->_data = $array;
return $this;
}
/**
* Export data as array
*
* @return array
*/
public function asArray() {
return $this->_data;
}
/**
* Export data keys as string
*
* @param string (optional) $clue
* @return string
*/
public function asString($clue = ",") {
return @implode ( $clue, @array_keys ( $this->_data ) );
}
/**
* Make string using $form
*
* @param string $selected
* @param string $form - use <key> <value> <selected> to place keys, values, selected string
* @param string $clue
* @return string
*/
public function asStringAdvanced($selected = NULL, $form = "<option value='<key>'<selected>><value></option>", $clue = NULL ) {
$data = (is_array($this->_data)) ? $this->_data : array();
while (list($key,$val) = each ($data) ) {
$data [$key] = str_replace (
array ("<key>", "<value>", "<selected>" ),
array ($key, $val, ($key == $selected) ? " selected" : "" ),
$form
);
}
reset ( $data );
return @implode ( $clue, $data );
}
/**
* Merge data with another data
*
* @param arr||str $array_or_string
* @param string(optional) $clue
* @return asList
*/
public function merge($array_or_string, $clue = ",") {
$array1 = (is_array($this->_data)) ? $this->_data : array();
$array2 = $this->_toArray ( $array_or_string, $clue );
$this->_data = array_merge($array1,$array2);
unset ( $this->_data [""] ); //data[] not allowed
return $this;
}
/**
* Intersect data with another data
* If array, forgot about it's keys, only values willbe used
*
* @param arr||string $array_or_string
* @param string (optional) $clue
* @return asList
*/
public function intersect($array_or_string, $clue = ",") {
if (! is_array ( $array_or_string )) {
$array = $this->_toArray ( $array_or_string, $clue );
$array = array_keys ( $array );
} else {
$array = array_values ( $array_or_string );
}
foreach ($array as $val) {
if ( isset($this->_data[$val]) ) $ret[$val] = $this->_data[$val];
}
$this->_data = $ret;
return $this;
}
/**
* Fill data with datas from $array
*
* @param array $array - associative array where to get new data from
* @param bool $preserve_original_if_not_exists - preserves original value if new array have no such key
* @return asList
*/
public function fillValuesFrom($array, $preserve_original_if_not_exists = true) {
while ( list ( $key, ) = @each ( $this->_data ) ) {
if ($preserve_original_if_not_exists && ! array_key_exists ( $key, $array )) {
//preserve original
} else {
$this->_data [$key] = $array [$key];
}
}
reset ( $this->_data );
return $this;
}
/**
* Remove data with given keys
* If array in argument, values willbe used for list of keys to be removed
*
* @param arr||string $array_or_string - list of keys
* @param string (optional) $clue
* @return asList
*/
public function remove($array_or_string,$clue=",") {
if (! is_array ( $array_or_string )) {
$array = $this->_toArray ( $array_or_string, $clue );
$array = array_keys ( $array );
} else {
$array = array_values ( $array_or_string );
}
foreach ($array as $item) {
unset ($this->_data[$item]);
}
return $this;
}
public function exists($key) {
return (isset($this->_data[$key])) ? true : false;
}
}
?>