2012-12-12 36 views
0

我發現了一些很好的方法來返回php字符串之間的常見值(通過爆炸& array_intersect等),但迄今爲止沒有太多的返回非常規值。PHP的比較字符串返回不常見的值?

我確實發現了一個解決非常見值的問題,the solution使用了array_diff & array_merge。我很難讓它看到實際值,以適應我的需求。

我正在使用遺留數據庫,並在其周圍建立了足夠的代碼以使適當的規範化成爲管道夢想,並將非常感謝任何見解。

我在mysql數據庫表中有兩列,一個是& b。列a的數據在b中被複制,並用一個空格分隔它們。我需要選擇/查詢/公開b中的非重複數據。它們之間有一個空間,但它不是唯一的空間,這使我瘋狂,因爲爆炸/內爆不會削減它(或者我不知道如何使它發生)。

現有:

一個蘋果,蘋果藍,蘋果紅大

b 蘋果橘子,蘋果藍香蕉,蘋果紅大紅寶石葡萄柚

我需要: 桔子,香蕉,紅寶石紅葡萄柚

有什麼想法?

+0

我們可以有代碼嗎? –

+0

你特別想要什麼?我試過的所有東西都失敗了。請查看錶格字段a和字段b的內容,以及上面所需的輸出。 – Gary

+0

@Daya,請停止鏈接到w3schools的PHP材料。它已經過時了,充滿了壞習慣和可怕的安全措施。相反,請鏈接到PHP手冊。在字符串函數的情況下,這將[在這裏](http://php.net/ref.strings)。 – Charles

回答

0

更新:我發現了一個在php.net上使用strstr()的技巧(下面使用)。 鏈接:由http://php.net/manual/en/function.strstr.php 提供:在mantoru根德點

$needle = 'Apples Red Big'; 
$haystack = 'Apples Red Big Ruby Red Grapefruit'; 

function strstr_after($haystack, $needle, $case_insensitive = false) { 
$strpos = ($case_insensitive) ? 'stripos' : 'strpos'; 
$pos = $strpos($haystack, $needle); 
if (is_int($pos)) { 
    return substr($haystack, $pos + strlen($needle)); 
} 
// Most likely false or null 
return $pos; 
} 

$goal = strstr_after($haystack, $needle); 
echo $goal; 

返回:寶石紅葡萄柚

0

根據上面的樣本列值和結果,我假設您只需要比較同一索引處的值。 ApplesApples OrangesApples BlueApples Blue Bananas,並Apples Red BigApples Red Big Ruby Red Grapefruit,因爲你不希望輸出如下Blue BananasRed Big Ruby Red Grapefruit

所以,你可以嘗試這樣的事:

$non_duplicates = array(); 
foreach($columnA as $idx => $val) { 
    $pos = strstr($columnB[$idx], $val); 

    if($pos !== false) 
     $non_duplicates[] = str_replace($val . " ", "", $columnB[$idx]); 
} 

var_dump($non_duplicates); 
+0

嗨SubRed,非常感謝您的建議,並且您的比較假設是正確的 - 每行。我試圖實現它,並不斷獲得'code'array(0){}'code' – Gary

+0

這是我的,請指出我的錯誤:'code' $ a = $ row_TableA ['a']] ; $ b = $ row_TableA ['b']; $ non_duplicates = array(); \t \t foreach($ a as $ idx => $ val){ \t \t \t $ pos = strstr($ b [$ idx],$ val); \t \t \t \t \t如果($ POS ==假!) \t \t \t \t $ non_duplicates [] = str_replace函數($ VAL 「」, 「」,$ B [$ IDX]); \t \t} \t \t \t \t的var_dump($ non_duplicates);'code' – Gary

+0

你有沒有試過'print_r'你'$了'你的'$ B'?我沒有看到這個函數有問題,你應該首先看到這些變量值。 – SubRed

0

這應該幾乎是你在尋找什麼......

$a = 'Apples, Apples Blue, Apples Red Big'; 
$b = 'Apples Oranges, Apples Blue Bananas, Apples Red Big Ruby Red Grapefruit'; 

$diff = array_diff(toArray($b), toArray($a)); //diff between b and a 
var_dump($diff); 

function toArray($str){ 
    $str = trim(str_replace(array(',',' '), array('',' '), $str)); //clean string up 
    return array_unique(explode(' ', $str)); //explode into array by spaces and make unique. 
} 

OUTPUT:

陣列(4) {[1] => string(7)「Oranges」[4] => string(7)「Bananas」[8] => string(4)「Ruby」[10] => string(10)「Grapefruit」}

+0

嗨on_,我不能在空間上爆炸,因爲在上面所需的結果中有空格。我在你的回覆中遺漏了什麼? – Gary