2011-02-09 23 views
1

這是一個奇怪的問題,但它是有趣的,所以我認爲我會問。假設我不喜歡php的foreach循環的運行方式,我總是以格式使用它,我所做的只是在外部添加了一個計數器,並在foreach循環內使用它來判斷我們是否在最後一個元素中。可以修改哪些foreach體系結構?

$counter = 1; 
$array_size = count($array); 
foreach($array as $item){ 
    //code 
    if($counter == $array_size){ 
     $isLast = true 
    } else { 
     $isLast = false; 
    } 
    $counter++; 
} 

我的問題是:我可以覆蓋或叉或繼承(或任何你想調用)原PHP foreach循環包括這一新的能力,所以,我現在可以做到這一點,而不需要初始化櫃檯等。

newforeach($array as $item){ 
    //code 
    $isLast = //something that returns true/false; 
} 

這是一個有趣的想法,所以我不知道這裏的鐵桿PHP的球員之一,能以某種方式實現這一目標?或者這種修改方式太複雜了,而沒有黑客的語言本身?

+2

根據定義,當然,改變語言控制結構的工作方式需要「黑客語言本身」 – 2011-02-09 11:03:13

+0

什麼[您的其他問題(http://stackoverflow.com/questions/4943719/in-foreach-islastitem-exists)? – Gumbo 2011-02-09 11:07:18

+1

至少使它更漂亮,你可以做`$ isLast =($ counter == $ array_size);` – gnur 2011-02-09 11:13:43

回答

1

如果你的問題很簡單:「你可以重寫PHP的語言結構,實施」答案是否定的。這是其它動態漢語語言等Javascript或Ruby通常被稱爲Monkey Patching或鴨衝孔的一個特徵。

2

這似乎是一種奇怪的做事方式。爲什麼不只是有這樣的東西:

$isLast = FALSE; 
foreach($array as $count => $item) 
{ 
    $isLast = ($count+1 == count($array)) 
} 

我敢肯定別人可以清理代碼了,這是從我寫PHP的一段時間。

或者,如果你喜歡你做這件事的方式,爲什麼不把你的if/then/else語句到一個函數說isLast,並調用它像這樣:

$isLast = isLast($item, $array)

0

你可以做到這一點(不修改語法):

function foreach_counter($ar, $callback) { 
    $counter = 1; 
    $array_size = count($ar); 
    foreach($ar as $item){ 
    $callback($item, $counter, $counter == $array_size); 
    $counter++; 
    } 
} 

foreach_counter(array('a','b'), function($item, $counter, $isLast) { 
    echo $counter . ': ' . $item . '' . ($isLast ? 'END' : ','); 
}); 
// outputs 1: a, 2: b END 

然而,正如你所看到的,它變得更難讀簡潔的版本,所以雖然你可以,你不應該這樣做 - 尤其是隻要你只是開始理解php。

很多時候,你想在這樣的循環中建立一個字符串。使用implode爲:

echo implode(', ', array(1,2,3)); 
// output: 1, 2, 3 
4

你可以寫,它使用的爲您執行此檢查的isLast會()方法包裝你遍歷(你需要把它落實Iterator interface)數組類。

是這樣的(僞):

$arrayIterator = new MyArrayIterator($myArray); 

foreach ($arrayIterator as $item) 
{ 
    if ($arrayIterator->isLast()) 
    { 
    doStuff(); 
    } 
} 
1

你可以重寫你的foreach與while循環,並通過項目使用next()迭代,就像這樣:

$array = array('a' => 'hi', 2 => 2515, 'as' => 'foo'); 
while (true) { 
    $item = current($array); 
    echo $item, "\n"; 
    if (!next($array)) { 
     echo '^last item!'; 
     break; 
    } 
}