2013-10-21 130 views
2

我有定义以下数组:交叉口PHP

array(
    'name'=>'Blue', 
    'age'=>'0', 
    'skin'=>array(
     'White Skin','Tanned Skin' 
    ), 
    'eye'=>array(
     'Black','Brown','Honey' 
    ), 
    'personality'=>array(
     'Intelligent','Warm','Trustworthy','Sweet' 
    ), 
    'ocassion'=>array(
     'Every day wear','Celebrations','Restaurant Dinner','Feasts','Visiting friends' 
    ), 
    'hair'=>'All Colors', 
    'style'=>array(
     'Loved to be admired','Center of attention' 
    ), 
    'description'=>'Blue lens are perfect for any..' 
); 

,我试图找到匹配的数量,从一个HTML表单到该阵列。从HTML形式的可能的返回,在阵列格式是:

Array 
(
[age] => 16 
[skin] => Tanned Skin 
[eye] => Brown 
[personality] => Array 
    (
     [0] => Intelligent 
     [1] => Warm 
     [2] => Trustworthy 
    ) 

[ocassion] => Weddings 
[hair] => Dark Brown 
[style] => Array 
    (
     [0] => Style Queen 
     [1] => Testing val 
    ) 

) 

我曾尝试迭代低谷第一阵列的每个键,但未能达到我想要的,也是我一直在使用的函数试图array_intersect_assoc($stack,$search)但它似乎不会找到完全匹配,因为$ search数组(第二个示例)具有一些键类型为string的key =>值对,并且它无法将任何出现匹配到第一个数组中,因为该值实际上是数组,而不是一个字符串。

有人可以指出我的想法,或可以让我知道什么是最好在这里做?

我在过去的3个小时里尝试了很多东西,但没有成功。

+0

什么**确实**你认为匹配? – Smuuf

+0

例如在定义的数组中,我有'''eye'=>数组('Black','Brown','Honey')'',并且从HTML获得''[eye] => Brown''。我认为HTML的响应正在被定义的数组中找到,所以它是匹配的 – roshkattu

+0

另外,如果我从** ** **或** ** **的HTML中获取数组,我认为每个值都匹配可以在_personality_或_style_数组键下找到已定义数组中的数组。 – roshkattu

回答

1

好的,那么怎么样。 源数据:

$demands = array(
    'name'=>'Blue', 
    'age'=>'0', 
    'skin'=>array(
     'White Skin','Tanned Skin' 
    ), 
    'eye'=>array(
     'Black','Brown','Honey' 
    ), 
    'personality'=>array(
     'Intelligent','Warm','Trustworthy','Sweet' 
    ), 
    'ocassion'=>array(
     'Every day wear','Celebrations','Restaurant Dinner','Feasts','Visiting friends' 
    ), 
    'hair'=>'All Colors', 
    'style'=>array(
     'Loved to be admired','Center of attention' 
    ), 
    'description'=>'Blue lens are perfect for any..' 
); 

$possible_match = array(
    'age'=>'16', 
    'skin'=>'Tanned Skin', 
    'eye'=>'Brown', 
    'personality'=>array(
     'Intelligent','Warm','Trustworthy' 
    ), 
    'ocassion'=>array(
     'Weddings' 
    ), 
    'hair'=>'Dark Brown', 
    'style'=>array(
     'Style Queen','Testing value' 
    ) 
); 

和匹配,使算法:

$result = array(); 
$count_matches = 0; 

// Go through all the demands 
foreach ($demands as $key => $value){ 

    // If there's a matching key in the possible match array 
    if (isset($possible_match[$key])){ 
     // If there are more demanded values 
     if (is_array($value)){ 
      // Let all demanded values be lowercase 
      $value = array_map('strtolower', $value); 
      // If there are more possible matching values 
      if (is_array($possible_match[$key])){ 
       // Let all possibly matching values be lowercase, too 
       $possible_match[$key] = array_map('strtolower', $possible_match[$key]); 
       // And then do the intersect. 
       $intersect = array_intersect($value, $possible_match[$key]); 
       if ($intersect){ 
        // If that intersect is not empty, add that to the resulting array 
        $result[$key] = $intersect; 
        $count_matches += count($intersect); 
       }; 
      } else { 
       // If there's only one possible matching value, search that 
       // value in the demaned array 
       if (in_array(strtolower($possible_match[$key]), $value, true)){ 
        // And add it to the results 
        $result[$key][] = strtolower($possible_match[$key]); 
        $count_matches++; 
       } 
      } 
     } else { 
      if (is_array($possible_match[$key])){ 
       // If there are more possible matching values but the demand is a string, 
       // find that string in those possible values 
       $possible_match[$key] = array_map('strtolower', $possible_match[$key]); 
       if (in_array(strtolower($value), $possible_match[$key], true)){ 
        // And add it to the results 
        $result[$key] = $value; 
        $count_matches++; 
       } 
      } else { 
       // If the demanded value is only one (= it's a string and not an array) 
       // and the possible match is also a string, do a lowercase compare 
       // + if there's a word "all" in the demanded value, pass it at all times ;D 
       if (strtolower($possible_match[$key]) == strtolower($value) 
        || stripos($value, "all") !== false){ 
        // And add it to the resulting array 
        $result[$key] = strtolower($value); 
        $count_matches++; 
       } 
      } 
     } 
    } 

} 

var_dump ($result); 
var_dump ($count_matches); 

有可能是用于优化一些机会,但基本的思路应该是有:)

结果:

array (size=4) 
    'skin' => 
    array (size=1) 
     0 => string 'tanned skin' (length=11) 
    'eye' => 
    array (size=1) 
     0 => string 'brown' (length=5) 
    'personality' => 
    array (size=3) 
     0 => string 'intelligent' (length=11) 
     1 => string 'warm' (length=4) 
     2 => string 'trustworthy' (length=11) 
    'hair' => string 'all colors' (length=10) 

加上计数,如果你愿意:

int 6 
+0

谢谢。它的工作原理与其应有的一样。我已经采取了另一种方法最终与两个foreach循环,但后来我看到了你的答案,我发现它更优化。所以我用你的。对于大拖延抱歉。 – roshkattu

+0

没问题,我很高兴我可以帮助:) – Smuuf