2016-12-04 35 views
0

我有一個php數組,其中包含以下格式的數據。可能只有唯一的值和一個NULL值,這需要消極的像其他值匹配。PHP將獨特項目數組轉換爲複雜的查詢字符串

$colors = array_unique([ 
    NULL, 
    "red", 
    "black" 
]); 

我想把它轉換成以下:

$converted = [ 
    "NOT LIKE '%red%' AND NOT LIKE '%black%'", 
    "LIKE '%red%' AND NOT LIKE '%black%'", 
    "LIKE '%black%' AND NOT LIKE '%red%'" 
]; 

我怎樣才能做到這一點?

我無法得到我的頭如何在PHP中實現這一點,我已經嘗試了foreach循環與數組的不同組合,但我不能動態地做到這一點,以便第一個$colour數組可以擴展的值,但它保持相同的原則(請參閱相同結構中擴展數據的示例2)。

例2

$colors = array_unique([ 
    NULL, 
    "red", 
    "black", 
    "purple", 
    "orange" 
]); 


$converted = [ 
    "NOT LIKE '%red%' AND NOT LIKE '%black%' AND NOT LIKE '%purple%' AND NOT LIKE '%orange%'", 
    "LIKE '%red%' AND NOT LIKE '%black%' AND NOT LIKE '%purple%' AND NOT LIKE '%orange%'", 
    "LIKE '%black%' AND NOT LIKE '%purple%' AND NOT LIKE '%orange%' AND NOT LIKE '%red%'", 
    "LIKE '%purple%' AND NOT LIKE '%orange%' AND NOT LIKE '%red%' AND NOT LIKE '%black%'", 
    "LIKE '%orange%' AND NOT LIKE '%red%' AND NOT LIKE '%black%' AND NOT LIKE '%purple%'", 
]; 

回答

2

這裏你們去

<?php 

function my_array_unique_query($values){ 
    $copy = $values; 
    $query = array(); 

    foreach($values as $a){ 
     $copy = remove_null_and_like($values, $a); 
     $q = ""; 
     if(!empty($a) && !is_null($a)){ 
      $q .= "LIKE %".$a."%'"; 
     }else{ 
      $q .= "NOT LIKE ".array_pop($copy); 
     } 
     if(count($copy) > 0){ 
      $q .= "AND NOT LIKE '".implode(' AND NOT LIKE ', $copy); 
     } 

     $query[] = $q; 
    } 
    return $query; 
} 

function remove_null_and_like($values, $like){ 
    $return = array(); 
    foreach($values as $a){ 
     if(!empty($a) && !is_null($a) && $a != $like){ 
      $return[] = "%".$a."%"; 
     } 
    } 
    return $return; 
} 

print_r(my_array_unique_query([ 
    NULL, 
    "red", 
    "black" 
])); 

print_r(my_array_unique_query([ 
    NULL, 
    "red", 
    "black", 
    "purple", 
    "orange" 
])); 

print_r(my_array_unique_query([ 
    NULL, 
    "red" 
])); 
+0

這一工程,但它打破如果只有兩個值'[NULL, '紅'] '例如? – Dan

+0

我已更新代碼以處理此問題。 –