2016-12-04 57 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

我已更新代码以处理此问题。 –