2010-01-06 3 views
4

, если у меня есть два массива, т.е.создание класса массива с PHP

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

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

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

echo $output; 

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

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

+1

Я не вижу технический вопрос здесь. Почему бы не использовать метод, который у вас уже есть? Было бы просто создать класс для обертывания этой функциональности. –

+3

Что вы хотите, чтобы этот класс? Вы хотите создать «класс SmileyReplacer»? Что случилось с тем, что у вас есть, и почему это должен быть класс? – Tesserex

+0

Вы также можете взглянуть на этот вопрос: http://stackoverflow.com/questions/65091/making-a-php-class-behave-like-an-array –

ответ

5

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

<?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
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, сделайте контрольную отметку. Я очень сомневаюсь, что вы можете придумать достаточно смайликов, так что это действительно повлияет на производительность.

2

Smiley

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); 
+1

Теперь это серьезно переработано, но весело :) – Gordon

+0

Я думал, что это будет уместно на тему, как смайлики. : P –

+1

Smiley должен реализовать интерфейс. Просто чтобы убедиться. И почему бы не использовать SplObjectStorage для SmileyMaper :: smileys :) err smiley1 – Gordon