2010-01-06 79 views
4

数组类,如果我有两个阵列,即使用PHP创建

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

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

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

echo $output; 

我想打一个类此的未来,我将要使用... 我怎样才能使一个类吧...

而且我怎样才能在一个类中封装你的函数创建此功能...

+1

我真的没有看到一个技术问题在这里。为什么不使用你已有的方法?创建一个类来包装这个功能很简单。 – 2010-01-06 20:00:44

+3

你想让这堂课做什么?你正在创建一个“SmileyReplacer类”?你有什么问题,为什么它应该是一个班级? – Tesserex 2010-01-06 20:01:07

+0

你也可以看看这个问题:http://stackoverflow.com/questions/65091/making-a-php-class-behave-like-an-array – 2010-01-06 20:13:05

回答

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),如果您想从外部提供地图,则可以传递关联数组。

如果您担心每次运行replace时拨打array_keys的呼叫,请执行基准测试。我非常怀疑你可以拿出足够的笑脸,所以它会对表演产生真正的影响。

2

笑脸

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 
    ); 
    } 
} 

​​
+1

现在,这是严重过度工程,但有趣:) – Gordon 2010-01-06 21:38:51

+0

我认为这将适用于像笑脸这样的主题。 :P – 2010-01-07 07:25:04

+1

Smiley应该实现一个接口。只想确认一下。为什么不为SmileyMaper :: smileys使用SplObjectStorage?err smiley1 – Gordon 2010-01-07 12:18:20