比较PHP中的数组

时间:2011-10-29 17:19:38

标签: php arrays

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

以下是数组:

1

(
    [0] => 20
    [optionid] => 20
)

2

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"

2 个答案:

答案 0 :(得分:0)

如果可以的话,将数组展平,所以不是$ array [0] [20],而是简单地通过$ array [20]访问它。

然后你可以循环遍历你需要的选项id,拉出字符串并将其附加到主sql字符串,同时附加一个','。 在循环之后,您可以只是rtrim($ string,“,”)删除最后的逗号

答案 1 :(得分: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