2011-10-29 80 views
1

我正在尝试创建动态表视图。我有两个数组。如果匹配,我想创建一个字符串。在PHP中比较数组

这里是数组:

(
    [0] => 20 
    [optionid] => 20 
) 
Array 
(
[0] => Array 
    (
     [1] => GROUP_CONCAT(if(optionid = 1, value_name, NULL)) AS 'Color' 
    ) 

[1] => Array 
    (
     [22] => GROUP_CONCAT(if(optionid = 22, value_name, NULL)) AS 'Crystal Color' 
    ) 

[2] => Array 
    (
     [25] => GROUP_CONCAT(if(optionid = 25, value_name, NULL)) AS 'Gauge' 
    ) 

[3] => Array 
    (
     [35] => GROUP_CONCAT(if(optionid = 35, value_name, NULL)) AS 'Height' 
    ) 

[4] => Array 
    (
     [18] => GROUP_CONCAT(if(optionid = 18, value_name, NULL)) AS 'Length' 
    ) 

[5] => Array 
    (
     [33] => GROUP_CONCAT(if(optionid = 33, value_name, NULL)) AS 'Pieces in Pack' 
    ) 

[6] => Array 
    (
     [26] => GROUP_CONCAT(if(optionid = 26, value_name, NULL)) AS 'Pincher Size' 
    ) 

[7] => Array 
    (
     [24] => GROUP_CONCAT(if(optionid = 24, value_name, NULL)) AS 'Rack' 
    ) 

[8] => Array 
    (
     [20] => GROUP_CONCAT(if(optionid = 20, value_name, NULL)) AS 'Ring Size' 
    ) 

[9] => Array 
    (
     [2] => GROUP_CONCAT(if(optionid = 2, value_name, NULL)) AS 'Size' 
    ) 

[10] => Array 
    (
     [34] => GROUP_CONCAT(if(optionid = 34, value_name, NULL)) AS 'Size in Pack' 
    ) 

例如,第一阵列上的值20上的第二匹配键20,从而我想把这个值添加到一个字符串中。如果他们超过两场比赛,我想要追加字符串。

最终的结果应该像

$string = "GROUP_CONCAT(if(optionid = 20, value_name, NULL)) AS 'Ring Size'" 

如果超过一个匹配。

$string = "GROUP_CONCAT(if(optionid = 20, value_name, NULL)) AS 'Ring Size', NEXT MATCHED VALUE" 
+3

我在一段时间看到的最尴尬的阵列结构的轻松之一。为什么索引到处都是? – NullUserException

+0

第二个数组子阵列上的索引是我试图匹配到第一个数组的一个属性。第一个数组是mysql结果。我建立了第二个,所以如果有帮助,我可以改变它。 – Busilinks

回答

0

拼合阵列出如果可以,所以不是$数组[0] [20],其简单地通过$阵列[20]访问。

然后,您可以遍历所需的选项ID,将字符串拉出并附加到主SQL字符串,并附加','。 循环之后,您可以只RTRIM($字符串,“”)删除最后一个逗号

0

只是看着它,我不认为你需要做你正在做的方式(在数组中有完整的语句)。这里只有两件事情是,在声明中改变,这样就把idalias到一个数组中,发现由:

<?php 

function getConcat($id) { 
    $group = "GROUP_CONCAT(if(optionid = %d, value_name, NULL)) AS `%s`"; 

    $groups = array(
     1 => 'Color', 
     2 => 'Size', 
     18 => 'Length', 
     20 => 'Ring Size', 
     22 => 'Crystal Color', 
     24 => 'Rack', 
     25 => 'Gauge', 
     26 => 'Pincher Size', 
     33 => 'Pieces in Pack', 
     34 => 'Size in Pack', 
     35 => 'Height' 
    ); 

    if ((!is_string($id) && !is_numeric($id)) || !isset($groups[$id])) { 
     return ''; 
    } 

    return sprintf($group, $id, $groups[$id]); 
} 

echo getConcat(22)."\n\n"; 
echo getConcat(50)."\n\n"; 
echo getConcat(35)."\n\n"; 
echo getConcat(18)."\n\n"; 
echo getConcat(1)."\n\n"; 

?> 

http://codepad.org/n1eCdv4H

上述会给你的查询语句。你可以设置一个功能也递归串联的语句列表,以及:

<?php 

function getConcatList($arrList=array(), $strList=NULL) { 
    $group = "GROUP_CONCAT(if(optionid = %d, value_name, NULL)) AS `%s`"; 

    if (!is_string($arrList) && !is_numeric($arrList) && !is_array($arrList)) { 
     return ''; 
    } else if (is_string($arrList) || is_numeric($arrList) && !empty($arrList)) { 
     $arrList = array($arrList); 
    } 

    $groups = array(
     1 => 'Color', 
     2 => 'Size', 
     18 => 'Length', 
     20 => 'Ring Size', 
     22 => 'Crystal Color', 
     24 => 'Rack', 
     25 => 'Gauge', 
     26 => 'Pincher Size', 
     33 => 'Pieces in Pack', 
     34 => 'Size in Pack', 
     35 => 'Height' 
    ); 

    $c_list = array_shift($arrList); 

    if ($groups[$c_list]) { 
     $c_strList = sprintf($group, $c_list, $groups[$c_list]); 

     if (strlen($strList)) { 
      $c_strList = "$strList, $c_strList"; 
     } 
    } else { 
     $c_strList = $strList; 
    } 

    if (!count($arrList)) { 
     return $c_strList; 
    } 

    return getConcatList($arrList, $c_strList); 
} 

echo getConcatList(22)."\n\n"; 
echo getConcatList(50)."\n\n"; 
echo getConcatList(array(35, 33))."\n\n"; 
echo getConcatList(array(1, 18, 35, 33))."\n\n"; 
echo getConcatList(array(1, 18, 70, 35, 33))."\n\n"; 

?> 

http://codepad.org/jsIFpWkt