создание класса массива с php - PullRequest
4 голосов
/ 06 января 2010

если у меня есть два массива, т.е.

$text = 'i am passed :)';
$fn = array(
':)',
':-)',
';;)'
)

$rep = array(
'smily1',
'smily2',
'smily3'
            );

$output = str_replace($fn, $rep, $text);

echo $output;

Я хочу создать класс для использования в будущем, где я захочу ... как я могу сделать класс для этого ...

а также как я могу создать функцию для этого ...

Ответы [ 3 ]

5 голосов
/ 06 января 2010

В основном, оборачивая вашу функцию в классе. Если вам нужна более продвинутая функциональность, вам придется указать.

<?php

class SmileyFilter {
  private $_keys;
  private $_values;

  function add($key, $value) {
     $this->_keys[] = $key;
     $this->_values[] = $value;
  }

  function add_all($pairs) {
    foreach ($pairs as $key => $value)
      $this->add($key, $value);
  }

  function replace($text) {
    return str_replace($this->_keys, $this->_values, $text);
  }
}

// usage

$s = new SmileyFilter();

$s->add(':)', 'smily1');
$s->add(':-)', 'smily2');
$s->add(';;)', 'smily3');

/* OR

$smileys = array(
  ':)'  => 'smily1',
  ':-)' => 'smily2',
  ';;)' => 'smily3');

$s->add_all($smileys);

*/


$s->replace('i am passed :)'); // "i am passed smily1"
?>
2 голосов
/ 06 января 2010

смайлик

class Smiley {
    private $name;
    private $data;

    public function getName() {
    return $this->name;
    }

    public function setName($name) {
    $this->name = $name;
    return $this;
    }

    public function getData() {
    return $this->data;
    }

    public function setData($data) {
    $this->data = $data;
    return $this;
    }
    function __construct($name = null, $data = null) {
    $this->name = $name;
    $this->data = $data;
    }

}

SmileyMapper

class SmileyMapper {
    private $smilies = array();

    public function addSmiley(Smiley $smiley) {
    $this->smilies[] = $smiley;
    return $this;
    }
    public function replaceSmileys($str) {
    return str_replace(
        array_map(
            create_function(
            'Smiley $item',
            'return $item->getData();'
            ),
            $this->smilies),
        array_map(
            create_function(
            'Smiley $item',
            'return $item->getName();'
            ),
            $this->smilies),
        $str
    );
    }
}

Пример

$text = 'i am passed :)';
$fn = array(
    ':)',
    ':-)',
    ';;)'
);

$rep = array(
    'smily1',
    'smily2',
    'smily3'
);

$sm = new SmileyMapper();
foreach ($fn as $k => $v) {
    $sm->addSmiley(new Smiley($rep[$k],$v));
}
echo $sm->replaceSmileys($text);
2 голосов
/ 06 января 2010
class SmileyReplacer
{
    protected static $_map = array(
        ':)'  => 'smiley1',
        ':-)' => 'smiley2',
        ';;)' => 'smiley3'
    );

    public static function replace($string)
    {
        return str_replace(array_keys(self::$_map), self::$_map, $string);
    }
}

// Usage
echo SmileyReplacer::replace('I am happy :)'); // I am happy smiley1

Я не вижу причин, по которым это должно быть создано, поэтому все статические классы в порядке. В этом нет реального состояния. Вы можете добавить статический метод addMap(array $map), который вы можете передать в ассоциированный массив, если вы хотите подать карту извне.

Если вас беспокоят звонки на array_keys каждый раз, когда вы запускаете replace, сделайте тест. Я очень сомневаюсь, что вы можете придумать достаточное количество смайликов, так что это действительно повлияет на производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...