2010-12-02 114 views
1

好的,我有一個非常定製的問題,所以忍受着我。PHP比較陣列值進行驗證

我基本上有兩組數據,我想與許多不同的可能性進行比較。

$data = array(
      'object'=>'ball', // Should check VALID (Rule 2) 
      'color'=>'white', // VALID (Rule 2) 
      'heavy'=>'no', // VALID (Rule 1) 
      'name'=>'wilson', // VALID (Rule 5) 
      'funny'=>'no'  // INVALID (Rule 4) 
      ); 

$data_2 = array(
      'object'=>'box', // VALID (Rule 2) 
      'color'=> 'blue', // VALID (Rule 2) 
      'texture'=>'hard', // VALID (Rule 1) 
      'heavy'=>'yes', // INVALID (Rule 4) 
      'stupid'=>'no'  // INVALID (Rule 4) 
           // Name is INVALID because it is missing (Rule 3) 

); 

$required = array(
      'color'=>array('white','blue'), 
      'heavy'=> 'no', 
      'name' 
); 

$errors = array(
     'color'=>array('required'=>'Color is Required','invalid'=>'Color invalid') 
     'object'=>array('invalid'=>'Object invalid'), 
     'texture'=>array('invalid'=>'Texture invalid'), 
     'heavy'=>array('required'=>'Heavy is Required','invalid'=>'Heavy invalid'), 
     'name'=>array('required'=>'Name is Required','max_char'=>'Name exceeds char limit', 
     'invalid'=>'Invalid item provided',   
); 

$blueprint = array(
       'object'=>array('box','ball'), 
       'color'=>array('blue','white'), 
       'texture'=>'hard', 
       'heavy'=>'no', 
       'name' 
      ); 

我想要做的就是運行$data通過$blueprint,確保以下內容:

  1. 如果$data鍵/值對的$blueprint鍵/值對匹配,$data「SK/v有效
  2. 如果$data鍵/值對匹配$blueprint鍵和來自嵌套數組的值,則$data'sk/v有效
  3. 如果$data陣列省略存在於$blueprint一個鍵/值對,$data「SK/v的可能仍然是有效的,如果它不位於$required陣列中
  4. 如果$data陣列提供一個密鑰/值對其中做在$blueprint不存在的,$data「SK/v是無效
  5. 如果從一個鍵/值對的$data鍵匹配的$blueprint值沒有定義鍵,$data」 SK/v仍然可以是有效的。但是,如果$blueprint同時具有定義的鍵和值,則$data的k/v必須滿足規則1的要求才有效。
  6. 我想強加給幾個$blueprint K/v,其中,如果$data的字符限制「SK/V超過該字符數限制,$data SK/V無效

如果$data」 sk/v是無效的,然後我想以某種方式將錯誤與特定的k/v關聯起來,描述爲什麼它是無效的(超過字符限制,一般錯誤等)。也許錯誤會在第三個數組中定義?

我查看了array_intersect_assoc,但不確定這是否超出了該功能的範圍。此外,$blueprint中會有大量的值,所以我需要儘可能多樣的東西。

我認爲這是正確的,當我寫這篇文章的時候,我的大腦融化了,所以請不要猶豫,如果感到困惑,請不要猶豫。我最好單獨驗證每個k/v嗎?

讓我們看看誰是那裏的聰明人。

+0

你可以添加各種陣列爲我們一起玩的;) – 2010-12-02 02:12:50

+0

肯定,給我幾分鐘到這... – 2010-12-02 03:37:23

回答

2

我覺得有點傻,但這裏有一個蠻力的方法。 #6你可以免費獲得,因爲它在任何意義上都不在陣列中。

foreach ($data as $k => $v) { 
    if (empty($blueprint[$k])) { 
     // (3) Data defines a key that isn't defined in blueprint. 
    } else { 
     if (is_array($blueprint[$k])) { 
      if (in_array($v, $blueprint[$k])) { 
       // (2) Data defines a valid value in a blueprint list. 
      } else { 
       // (also 4) Data defines a value not in a blueprint list. 
      } 
     } else if ($v == $blueprint[$k]) { 
      // (1) Data defines a value in the blueprint. 
     } else if (in_array($v, $blueprint)) { 
      // (5) Data is in the blueprint without a key. 
     } else { 
      // (4) Data is invalid. 
     } 
    } 
} 

編輯:這是用於檢查$ blueprint是否有$ data沒有定義的鍵的循環。在運行之前,可能需要切換以確保這是必要的(在前面的塊中)。

foreach ($blueprint as $k => $v) { 
    if (empty($data[$k])) { 
     // (6) Data doesn't have a required key from blueprint. 
    } 
} 
0

是的,你可能必須自己編碼,因爲我不認爲有任何內部函數可以做到這一點。應該不會太難,因爲您已經對您的需求有了很好的描述 - 只需將其翻譯成PHP即可。

+0

是的,我懷疑任何功能的存在,將做到這一點,但我真正在尋找如何構建這個功能的方向,因爲我寫的任何東西都會像糊塗一樣出現。 – 2010-12-02 01:48:49

2

真相被告知,這本身並不困難,它的複雜性。您可以使用array_map函數來簡化映射;它看起來像這樣:

function validate_data($data, $blueprint) 
{ 
    // an implementation of all that stuff you wrote using lots of 
    // for loops and if statements 
} 

array_map('validate_data', $data, $blueprint); 

查看手冊頁以瞭解更多細節。你可以這次是糠:) :)

+0

我喜歡這樣的外觀,會看到我能想出什麼並回報 – 2010-12-02 02:05:09

+0

困難是在旁觀者的眼中....這個功能讓我發瘋.. – 2010-12-02 03:57:44

2

你想使用in_array()。它將搜索數組的值並查找不同的值,例如。

foreach($data as $key => $val) { 
    $check = in_array($val, $blueprint); 
    if($check === false) { 
    print("invalid"); 
    die; 
    } 
} 
3

我對示例代碼做了一處更改。如果您將名稱變爲一個鍵而不是數字鍵值,看起來更容易。

$required = array(
'color'=>array('white','blue'), 
'heavy'=> 'no', 
'name' => '', # name now a key 
); 

這現在適用於您的許多規則。主要檢查所需的密鑰,並且不存在必需的和藍圖以外的額外密鑰。

# check required keys 
$missing = array_diff_key($required, $data); 
if($missing) { 
    var_dump($missing); # react to missing keys 
} 

# check against all possible keys 
$possible = array_merge_recursive($blueprint, $required); 
$extra = array_diff_key($data, $possible); 
if($extra) { 
    var_dump($extra); # react to extra keys 
} 

現在對於其餘的我真的需要知道你到畸形數據等如何應對,但如果你的數據,現在通過這兩項測試,你在你認爲合適的方式作出反應,你應該清楚迭代通過陣列並使用array_search()filter_var()進行驗證以檢查長度。