2011-10-29 3 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].

Затем вы можете просто запрограммировать нужный вам параметр, вытащить строку и добавить ее в основную строку sql вместе с добавлением ','. После цикла вы можете просто RTrim ($ строка «»), чтобы удалить заключительную запятую

0

Просто глядя на него, я не думаю, что вы нужду сделать это так, как вы делаете это (с полным выражением в массиве). Там только две вещи, которые изменяются в заявлении, так положить id и alias в массив и найти, что:

<?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

Смежные вопросы