2010-01-06 53 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