2015-10-28 176 views
0

我嘗試的foreach對來自爆炸()PHP爆炸陣列的foreach

我有此數組:的foreach之前

 $links = " http://hi.co.il<br> 
     ht tp://hi.co.il<br> 
    http://hi.co.il<br> 
    http://hi.co.il<br> 
    http://hi.co.il<br> 
    http://mega.co.il<br> 
    http://hi.co.il"; 

    $links = explode('<br>',trim($links)); 
    //$links = preg_replace('/\s+/', '', $links); 
    $currenturl = "http://mega.co.il"; 

    //if(($key = array_search($currenturl, $links)) !== false) { 
    // unset($links[$key]); 
//} 

    foreach($links as $key => $value): 

    if($value == $currenturl): 
     unset($links[$key]); 
    endif; 

    endforeach; 

    print_r($links); 

$鏈接印刷:印刷

Array ([0] => http://hi.co.il [1] => ht tp://hi.co.il [2] => http://hi.co.il [3] => http://hi.co.il [4] => http://hi.co.il [5] => http://mega.co.il [6] => http://hi.co.il) 

$鏈接在以後:

http://hi.co.il ht tp://hi.co.il http://hi.co.il http://hi.co.il http://hi.co.il http://mega.co.il http://hi.co.il 

爲什麼foreach從數組中返回到字符串? 我想檢查與foreach,如果它的當前url然後從數組中取消設置,我是新手,我可以使它與array_search工作,但我想用foreach做到這一點。

感謝您的回答,並對不好的英語感到抱歉。

+0

[我無法重現該問題](http://sandbox.onlinephpfunctions.com/code/70650a75b725b007f1cb6f0b1855f98f4e337487)。你有可能幫助重現它嗎? – showdev

+1

如果你在原始'$ links'字符串中有換行符,你可能想要在循環的每次迭代中調用'$ value = trim($ value)'。否則,換行符將成爲每個字符串的一部分,而不是完全匹配。初始修剪只會刪除整個字符串中的空格,而不是結果數組中的每個值。 –

回答

0

這工作得很好,沒有什麼是把數組轉換成字符串。之後你應該修剪你的琴絃,以便你的搭配工作。

<?php 

$links = "http://hi.co.il<br> 
http://hi.co.il<br> 
http://hi.co.il<br> 
http://hi.co.il<br> 
http://hi.co.il<br> 
http://mega.co.il<br> 
http://hi.co.il"; 

$links = explode('<br>',trim($links)); 
print_r($links); 
$currenturl = "http://mega.co.il"; 

foreach($links as $key => $value) { 
    if(trim($value) == $currenturl) { 
     unset($links[$key]); 
    } 
} 
print_r($links); 
?> 

我建議不使用alternate syntax代碼塊,這些通常意味着在HTML模板使用,將可能讓你陷入困境。

+0

我發誓,沒有爲我工作,然後現在我把你的foreach和這個工作,感謝兄弟。 – user2635001

+0

我會建議使用'==='而不是'=='。 –

1

試試這個:

$links = array_filter(
    $links,function($element) { 
    return $element !== 'http://mega.co.il'; 
}); 

array_filter將刪除任何元素,其中function的返回值是false。對於所有元素,返回值將爲true,但匹配的除外。

和miken32是對你的:endif的東西。通常只有當你的PHP代碼被輕微地撒在一個大部分HTML文件中時纔會使用它。對於純PHP代碼,大多數人使用大括號{}以及縮進。

考慮JonathanKuhn的評論,你也可以試試這個微小的變化:

$links = array_filter(
    $links,function($element) { 
    return strpos($element,'http://mega.co.il') !== true; 
}); 

這也會給你所需的過濾效果,但它不會刪除所有換行符。要刪除換行符,你可以這樣做:

array_walk($links,function($value,$key) { 
    $value = trim($value); 
}); 
$links = array_filter(
    $links,function($element) { 
    return strpos($element,'http://mega.co.il') !== true; 
}); 
+0

感謝替代方式,但我更喜歡foreach,因爲我需要做更多的事情部分數組鍵。 – user2635001

+0

@ user2635001您也可以使用'array_walk'將函數應用到數組的每個元素。我在某個地方看到'foreach'循環中不確定的元素會導致不可預知的結果,但我現在找不到這個參考。出於這個原因,我經常在foreach循環中使用數組的副本,然後將該數組複製到原始數組變量中。另外,你應該接受miken的回答,因爲你接受了它。;) –