2013-02-08 86 views
1

我对PHP数组和我想要做的一些比较有点麻烦。对不起,因为我的英语不好:(比较所有键的多个阵列

我正在建立一个图片管理系统,用户可以一次选择多张图片,并编辑所有选定图片的信息,但有些字段已经填入 - 如果一个特定的字段被多个图片的不同信息填充,那么就想向用户显示'*'字符。

我的问题是以下内容: - 我有一个二维数组,包含所有mySQL查询结果选择的图片(这个数字当然是不确定的) 下面是一个结果数组的例子:

Array 
(

[0] => Array 
    (
     [Folder_id] => 40 
     [Title_fr] => test 
     [Title_en] => 
     [Desc_fr] => 
     [Desc_en] => 
     [Place_fr] => Koksijde, Belgique 
     [Place_en] => Koksijde, Belgium 
     [Place_ICAO] => EBBE 
     [Place_city] => 
     [Place_country] => be 
    ) 

[1] => Array 
    (
     [Folder_id] => 40 
     [Title_fr] => test 
     [Title_en] => 
     [Desc_fr] => 
     [Desc_en] => 
     [Place_fr] => Koksijde, Belgique 
     [Place_en] => Koksijde, Belgium 
     [Place_ICAO] => EBBE 
     [Place_city] => 
     [Place_country] => be 
    ) 

[2] => Array 
    (
     [Folder_id] => 40 
     [Title_fr] => test 
     [Title_en] => 
     [Desc_fr] => 
     [Desc_en] => 
     [Place_fr] => Koksijde, Belgique 
     [Place_en] => Koksijde, Belgium 
     [Place_ICAO] => EBBE 
     [Place_city] => 
     [Place_country] => be 
    ) 

[3] => Array 
    (
     [Folder_id] => 51 
     [Title_fr] => test 
     [Title_en] => 
     [Desc_fr] => 
     [Desc_en] => 
     [Place_fr] => FRANC 
     [Place_en] => ANGLE 
     [Place_ICAO] => ENGL 
     [Place_city] => Münich2 
     [Place_country] => de 
    ) 

正如您所看到的,一些字段对于所有记录可能是通用的,有些字段可能不同。例如,[Place_fr]对于所有记录都不相同,但是[Desc_fr]是。

我想编写一个函数,返回一个数组,其中所有字段都作为关键字,如果此字段包含记录之间的不同值,并且值为'*',并且值为所有记录共有的值。

例如,这里的结果将是:

Array 
( 
     [Folder_id] => * 
     [Title_fr] => test 
     [Title_en] => 
     [Desc_fr] => 
     [Desc_en] => 
     [Place_fr] => * 
     [Place_en] => * 
     [Place_ICAO] => * 
     [Place_city] => * 
     [Place_country] => * 
) 

我知道这可能和array_diff_assoc使用来完成()。使用两个数组很容易。问题是我必须传递无限数量的参数给这个函数,我不知道如何解决这个问题。

对不起noob问题 - 我只是一个beginer当谈到阵列。

感谢您的帮助!

回答

1

这应做到:

// get common keys => values 
$common = call_user_func_array('array_intersect_assoc', $arr); 

// and append missing keys to them, with "*" values 
$common += array_fill_keys(array_keys($arr[0]), '*'); 

(假设$arr高于你的阵列)

+0

我其实觉得你的答案更好。 +1 – Antony 2013-02-08 16:43:37

0
$arrays = array (
    array (
     "Folder_id" => 40, 
     "Title_fr" => "test", 
     "Title_en" => "", 
     "Desc_fr" => "", 
     "Desc_en" => "", 
     "Place_fr" => "Koksijde, Belgique", 
     "Place_en" => "Koksijde, Belgium", 
     "Place_ICAO" => "EBBE", 
     "Place_city" => "", 
     "Place_country" => "be" 
    ), 
    array (
     "Folder_id" => 40, 
     "Title_fr" => "test", 
     "Title_en" => "", 
     "Desc_fr" => "", 
     "Desc_en" => "", 
     "Place_fr" => "Koksijde, Belgique", 
     "Place_en" => "Koksijde, Belgium", 
     "Place_ICAO" => "EBBE", 
     "Place_city" => "", 
     "Place_country" => "be" 
    ), 
    array (
     "Folder_id" => 40, 
     "Title_fr" => "test", 
     "Title_en" => "", 
     "Desc_fr" => "", 
     "Desc_en" => "", 
     "Place_fr" => "Koksijde, Belgique", 
     "Place_en" => "Koksijde, Belgium", 
     "Place_ICAO" => "EBBE", 
     "Place_city" => "", 
     "Place_country" => "be" 
    ), 
    array (
     "Folder_id" => 51, 
     "Title_fr" => "test", 
     "Title_en" => "", 
     "Desc_fr" => "", 
     "Desc_en" => "", 
     "Place_fr" => "FRANC", 
     "Place_en" => "ANGLE", 
     "Place_ICAO" => "ENGL", 
     "Place_city" => "Münich2", 
     "Place_country" => "de" 
    ) 
); 

function compare($arrays) { 
    foreach ($arrays as $array) { 
     foreach ($array as $key => $value) { 
      if (!isset($result[$key])) { 
       $result[$key] = $value; 
      } else if ($result[$key] !== "*") { 
       if ($value !== $result[$key]) { 
        $result[$key] = "*"; 
       } 
      } 
     } 
    } 
    return $result; 
} 

echo "<pre>"; 
print_r(compare($arrays)); 
echo "</pre>"; 
+0

即点上我想要的东西来实现! 非常感谢您的帮助,非常感谢! – 2013-02-08 16:42:03

+0

@ClémentChristomanos你应该考虑一个诡计小马的答案。 – Antony 2013-02-08 16:43:10