2012-01-28 26 views
1

終極目標使用數組(或XML)編程功能

就是讓類似的Magento提供 - 基本邏輯建設者,和#2所示的這個帖子:jQuery (or any web tool) Nested Expression Builder到目前爲止,我已經做jQuery構建樹並獲取我希望構建器使用,檢查和設置的數據。現在我只需要解析這些檢查並將其添加到我正在編寫的腳本的各個位置 - 但我不確定如何動態處理它,以便執行這些檢查,這將導致發生某些操作/數據發生更改自動。

也許我們可以稱之爲動態表達式處理?

原貼

原諒我,我知道我想幹什麼,但根本不知道該怎麼辦呢 - 所以我在尋找一些靈感。我已經允許生成一個多維數組,並且該數組將包含某些'命令'和邏輯函數,並且當條件爲真時,它將被執行。

這是最基本的形式,該數組將包含一組if語句,如果該語句爲真,那麼會進入下一個數組項,然後下一個級別,如果它是假的, d進入沒有孩子的下一個數組項目(未婚兄弟姐妹,我想我們可以稱之爲)。一旦沒有什麼可以處理的,因爲沒有什麼是真的,那麼什麼都不會發生。

我想可能是通過XML提供數據的最佳方式 - 儘管如此,我可能會繼續深入下去,否則就會下降,直到出現真實情況?

基本上,數組採用以下形式(雖然我不是100%肯定,我編寫正確,但我認爲它看起來右:S):

[0][0] => array('function' => 'if', 'check' => 'day', 'condition' => 'equals', 'value' => '3'); 
[0][1][0] => array('function' => 'set', 'name' => 'date_day', 'value' => 'wednesday'); 
[1][0] => array('function' => 'if', 'check' => 'day', 'condition' => 'equals', 'value' => '4'); 
[1][1][0] => array('function' => 'set', 'name' => 'date_day', 'value' => 'thursday'); 

所以上面會 - 如果日= 3,然後將date_day設置爲星期三;否則,如果天= 4,則設置date_day週四

這我想像將對應於(雖然我不知道,如果你能分項):

<items> 
    <item> 
     <function>if</function> 
     <check>day</check> 
     <condition>equals</condition> 
     <value>3</value> 
     <item> 
      <function>set</function> 
      <name>date_day</name> 
      <value>wednesday</value> 
     </item> 
    </item> 
    <item> 
     <function>if</function> 
     <check>day</check> 
     <condition>equals</condition> 
     <value>4</value> 
     <item> 
      <function>set</function> 
      <name>date_day</name> 
      <value>thursday</value> 
     </item> 
    </item> 
</items> 

它們基本上將作出以下聲明在某種類型的功能:

function ($current_data){ 
    LOOP 
    if(FUNCTION == "if"){ 
     if(CHECK CONDITION VALUE){ 
     **go to next item deeper in the chain** 
     } else { 
     **go to sibling item** 
     } 
    } else if(FUNCTION == "set"){ 
     define(NAME, VALUE); 
    } 
    ENDLOOP 
} 

我知道上面可以使用date()函數來完成,但是這是一個非常簡單的例子。另一個例子可能涉及檢查輸入的顏色是否是紅色,如果是,則根據此顏色設置一些顏色,如果顏色是藍色,則可以執行其他操作。另一個可能是將該模板設置爲美國訪問者,如果美國國旗被點擊。重點是它可以基本上完​​成任何操作並進行檢查並給出結果 - 基本上就像編程 - 但函數數據由PHP或XML提供的地方

我確定必須有一些東西在那裏可以做到這一點,但我不知道要開始準確,所以任何援助將是偉大的 - 是的,我知道可能有一些安全問題,但我打算檢查,檢查checks,conditions,values,等等是安全的(所以這需要能夠被考慮進去)。

很多很多謝謝!

+2

什麼是你想在這裏完成的?你讓自己的方式太複雜了..嗯,我認爲你在找什麼是array_map函數?我不知道什麼是你試圖做...要執行 – SolidSnake 2012-01-28 23:54:38

+0

基本上允許檢查未硬編碼,可以這麼說,但可以在一個陣列/ XML的形式產生。我知道這聽起來有點複雜 - 但基本上只需要讀取數組或xml並根據其內容執行操作/檢查。 – MrJ 2012-01-28 23:57:39

+0

啊哈我認爲你是在正確的方向上,我只能說你需要使用array_map,這對你有很大的幫助。所以不要使用循環。你只是完成實現你的(功能+您的數組值或XML文件)..然後使用array_map加載與功能的陣列.. – SolidSnake 2012-01-29 00:09:52

回答

0

好了JSON與XML之外,這裏的我會怎樣處理該陣列...

$array = xmldecode($xml); 
$resultFound = false; 
$i = 0; 

while(!$resultFound && $i < count($array)) { 
    if (myFunction($array[$i]) { 
     $resultFound = true; 
    } 
    $i++; 
} 

if (!$resultFound) { 
    // error condition 
} 

function myFunction($array) { 
    $function = $array[0]['function']; 

    switch($function) { 
     case 'if': 
      $checkVariable = $array[0]['check']; 
      $condition = $array[0]['condition']; 
      $checkValue = $array[0]['value']; 
      switch($checkVariable) 
       case 'day': 
        switch($condition) { 
         case 'equals': 
          if (GLOBAL_DAY == $checkValue) { 
           return myFunction($array[1]); 
          } else { 
           return false; 
          } 
          break; 
         case 'less than': 
          if (GLOBAL_DAY < $checkValue) { 
           return myFunction($array[1]); 
          } else { 
           return false; 
          } 
          break; 
        } 
       break; 
      } 
     break;  
     case 'set': 
      $setVariable = $array[0]['name']; 
      $setValue = $array[0]['value']; 
      switch($setVariable) { 
       case 'date_day': 
        GLOBAL_DATE_DAY = $setValue; 
        return true; 
        break; 
      } 
     break; 
    } 
} 
+0

如果存儲空間/傳輸速度不是問題,我會避免使用JSON來配置可以人爲編輯的配置文件。 – 2012-01-29 00:27:06

+1

是的,我同意。這篇文章已經多次編輯,我不能留下評論,但我首先回應修復了數組結構,然後編輯了正確的數據結構,並且我想解決這個問題的觀點,即XML是最好的編程方式。 – Ally 2012-01-29 00:32:21

+0

那麼,顯然他的編程生成的代碼通過JS接口,所以它可能並不需要是人編輯。所以JSON在這裏可能是正確的選擇。 – 2012-01-29 00:37:16

0

你的問題是非常相似的表單驗證的,所以我會看一些流行的jQuery表單驗證插件或像CakePHP這樣的MVC框架。這些通常都具有用於最常見的驗證規則的庫存構建塊,用戶可以容易地將它們放在一起並傳遞特定參數以涵蓋大多數場景。

您的問題,這些例子之間的顯着區別是,表單驗證框架是面向開發人員,這樣他們就可以簡單地編寫自定義的功能,如果他們需要膠水多個規則在一起,形成更復雜的規則。但是,你仍然可以實現的東西,通過做這樣的事情對於所有用例大概98%的工作原理:

$offers = array(
    'pet feed sale' => array(
    'category' => array(1, 2, 3) 
    'total' => '>100', 
    'weekday' => array('mon', 'wed') 
    'set' => array(
     'discount' => 80 
     'shipping' => 0 
    ) 
), 
    'medication sale' => array(
    'category' => 4 
    'date' => '2012-1-28', 
    'set' => array(
     'discount' => 50 
    ) 
) 
); 

而且,如果用戶需要應用更復雜的定價結構,那麼他們可以,例如,打破了「寵物飼料銷售「規則分爲3個優惠,一個用於狗糧,一個用於貓糧,另一個用於魚類食品。可能會有更多的重複,但它比完整的解析器更容易實現。

而且,大多數非程序員可能處理重複了很多比複雜的邏輯和控制流更好。

+0

感謝讓所有內容保持一致的想法和模板,我現在已經實現了您所概述的內容 – MrJ 2012-01-29 19:35:25