2010-09-09 72 views
3

我有一個這樣的數組:PHP - 檢查,如果一個或多個陣列領域存在

array('prefix1_field' => 34, 
     'prefix1_anotherfield' => 345, 
     'prefix1_andanotherfield' => 565, 

     'anotherprefix_field' => 34, 
     'anotherprefix_anotherfield' => 345, 
     'anotherprefix_andanotherfield' => 565, 

     'prefix3_anotherprefix_field' => 34, // <- 'anotherprefix' here should be ignored 
     'prefix3_anotherfield' => 345, 
     'prefix3_andanotherfield' => 565, 
     ... 
); 

我怎樣才能讓來檢查,如果有這個數組與prefix1_例如開始於任何領域的功能?

回答

2
function check_array_key_prefix_exists($array, $key_prefix) { 
    $keys = array_keys($array); 
    foreach ($keys as $key) { 
    if (0 == substr_compare($key, $key_prefix, 0, strlen($key_prefix))) { 
     return true; 
    } 
    } 

    return false; 
} 
+0

完美。謝謝 – Alex 2010-09-09 12:27:03

2

喜歡的東西:

function check($arr,$prefix) { 
     foreach($arr as $key => $value) { 
       if(strcmp(substr($key,0,strlen($prefix)),$prefix)==0) { 
         return true; 
       } 
     } 
     return false; 
} 
+0

如果「prefix1_」是可變的,你可以避免還必須包含長度'if(strpos($ key,$ prefix)=== 0)?' – Fanis 2010-09-09 12:16:23

+0

@Fanis - 儘管這樣會比嚴格的做更多的工作因爲它會一直在尋找'prefix1_',即使它在'$ key'的開頭找不到。 – 2010-09-09 12:17:55

+0

@多米尼克我不確定。 '=== 0'得到它是否在該字符串中的索引是0,即字符串的開始。其實你提出了一個有趣的觀點,讓我質疑我爲此使用strpos的習慣。我假設'strpos()'將在整個$字符串中搜索$前綴,但是如果它在開頭,它會立即找到並返回(int)0。但是,如果不是,它會浪費整個$前綴。另一方面,substr()使用內存來創建一個新變量。我認爲這是微不足道的。 – Fanis 2010-09-09 12:24:05

2

爲什麼不使用正則表達式?

function array_has_key_prefix($array, $key_prefix) { 
    foreach($arr as $key => $value) { 
    if(preg_match("/^" . $key_prefix . "/", $key)) 
     return true; 
    } 
    return false; 
} 
+0

這會工作,但似乎是做一個相當大的錘子做簡單的字符串匹配。雖然第一個好答案! – 2010-09-09 12:29:41

+1

正則表達式最終比strcmp()或substr_compare()慢嗎? – Groovetrain 2010-09-09 12:41:05

+0

是的,我也很好奇:) – Alex 2010-09-09 12:56:07

1

我寧願重組排列如下:

$data=array('prefix1'=>array(
        'field'=>34, 
        'anotherfield'=>345, 
       ), 
      'prefix2'=>array(
        'field'=>56, 
       ), 

...等。

通過這種結構,您可以快速調用標準PHP函數array_key_exists()。

有了這個結構,你必須將你自己的選擇基本上推廣到array_key_exists(),這會涉及到foreach()循環和explode()把鍵分成幾個比特。

1

我不會提供太多的信息,我會透露性地寫s.t.類似於Dominique Roger的職位。

我不知道我是否回答了你的問題部分,因爲我沒有將它運行到他bwowser中。 好運