php complex assoc array与$ _POST匹配

时间:2013-02-14 11:42:35

标签: php mysql multidimensional-array

我有阵列

Array('0284'=>array('name'='XX',
                    'inputs'=array(
                                array('sysname'=>'KEY_TO_MATCH1',....);
                                array('sysname'=>'KEY_TO_MATCH2',....);
                                  ),
      '0287'=>array('name'='YYY',
                    'inputs'=array(
                                array('sysname'=>'KEY_TO_MATCH3',....);
                                array('sysname'=>'KEY_TO_MATCH4',....);
                                )
      );

我想要的是搜索$ _POST,如果密钥sysname存在,则返回数组'name'..

示例如果$ _POST ['KEY_TO_MATCH1']存在则返回XX

修改

数组结构说明:

数组是获取db表的结果

plugins(id,name,user_id)

plugins_inputs(id,plugin_id(FK),sysname,label,value,extra_attrs)

我所做的是获取所有插件及其输入,然后我通过pluigns_id将它们分开

Array('plugins.id'=>array('name'='plugins.name',
                        'inputs'=array(//all rows from plugins_inputs where plugin_id=plugins.id
                                    array('sysname'=>'KEY_TO_MATCH1',....);
                                    array('sysname'=>'KEY_TO_MATCH2',....);
                                      )

plugins.id作为关键:避免重复,因为我不能信任form.name

plugins.name:指向处理这些输入的函数名称

plugins_inputs:包含多行输入

现在我想听$ _POST案例中的任何这些输入,然后重定向它 到那个形式处理它的特定功能。 $this->${plugins.name}->backend();

目前正在使用

foreach($array as $id=>$val){
 foreach($val['inputs'] as $input)
  //$this->input->post is codeigniter help to handle $_POST[] if it doesnt exist it return false
   if($this->input->post([$input['sysname']])runbackend($val['name'],$id);
 }

但我想知道是否有更聪明的方法来做...使用array_filter或array_map或者其他东西......     }

5 个答案:

答案 0 :(得分:1)

首先,将数组结构排序。这是它应该如何看待。我也改变了你的一些= to =>,和;在你的代码中,因为它们是数组中的语法错误。

$outerarray = array(
   '0284'=>array('name' => 'XX',
                 'inputs' => array(
                            array('sysname'=>'KEY_TO_MATCH1',....),
                            array('sysname'=>'KEY_TO_MATCH2',....),
                  )
           ),
   '0287'=>array('name' => 'YYY',
                 'inputs' => array(
                   array('sysname'=>'KEY_TO_MATCH3',....),
                   array('sysname'=>'KEY_TO_MATCH4',....),
                  )
           )); 
foreach ($outerarray as $outerkey=>$outervalue) {
  foreach ($outervalue[]['inputs'] as $searcharray) {
    foreach($searcharray as $key=>$value) {
      if ($value == $_POST['KEY_TO_MATCH1']) return $outerkey;
    }
  }
}

答案 1 :(得分:1)

试试这个...

foreach($data as $key => $d) 
{

  foreach($d as $key => $dat) 
  {

       if(in_array("$_POST['KEY_TO_MATCH1']",$dat['inputs'])
       {
         echo $d['name'];
       }
       else {
       echo "Not found";

       }
 }
}

答案 2 :(得分:1)

$ child是您要匹配的值,$ stack是要搜索的数组。

function getParentStackComplete($child, $stack) {
    $return = array();
    foreach ($stack as $k => $v) {
        if (is_array($v)) {
            // If the current element of the array is an array, recurse it 
            // and capture the return stack
            $stack = getParentStackComplete($child, $v);

            // If the return stack is an array, add it to the return
            if (is_array($stack) && !empty($stack)) {
                $return[$k] = $stack;
            }
        } else {
            // Since we are not on an array, compare directly
            if ($v == $child) {
                // And if we match, stack it and return it
                $return[$k] = $child;
            }
        }
    }

    // Return the stack
    return empty($return) ? false: $return;
}

示例

$array = array(
    'balloon' => array(
        'red' => array(1 => 'Love', 'Valentine', 'Heart',),
        'green' => array(1 => 'Summertime', 'Hope',),
    ),
    'ribbon' => array(
        'yellow' => array(2 => 'Welcome',),
        'red' => array(3 => 'Love', 'Love',),
    ),
);
$c = getParentStackComplete('Love', $array);

<强> RESULT

array
  'balloon' => 
    array
      'red' => 
        array
          1 => string 'Love' (length=4)
  'ribbon' => 
    array
      'red' => 
        array
          3 => string 'Love' (length=4)
          4 => string 'Love' (length=4)

答案 3 :(得分:0)

首先尝试从所有值中生成1个数组。为此,您需要获取输入并将它们与数组键值相结合。

如果您已完成此操作,请获取帖子的值,并通过刚刚创建的阵列进行操作。如果匹配,则返回数组键。

答案 4 :(得分:0)

您的架构非常复杂。我不知道你的用例,但我相信你可以通过摆脱输入的双倍深度来简化它。

如果您保留(或必须保留)此架构,则必须处理搜索:

foreach($baseArray as $key=>$value){
    foreach($value['inputs'] as $subArray){
       if(subArray['sysname'] === $keyToMatch{
          return $key;
       }
    }
}
return '';