2012-10-03 33 views
3

我有一個數組,其中包含從JSON文件生成的大量數據。大多數數據用於填充input元素,但其中一些鍵包含隱藏的默認值,稍後將用於計算。PHP中的通配符數組循環

的陣列看起來是這樣的:

[name] => 'My App' 
[default_E17] => 0.009 
[default_H17] => 0.0236 
[default_K17] => 50 
[default_P17] => 0.0118 
[default_E19] => 0.03 

我想遍歷所有default_*鑰匙,並將其輸出使用HTML。基本上,我想要一個foreach循環,但只適用於格式匹配default_*的密鑰。有誰知道這是否可能?

請注意,[default_*]鍵之前的數組中的值是可變長度的,所以我不能輕易使用array_splice()

+0

不得不遍歷整個數組,並檢查密鑰匹配模式 –

回答

7

您使用strpos($key, "default_") === 0表明它開始default_和它不是在中間或結束

$array = array(); 
$array['name'] = 'My App'; 
$array['default_E17'] = "0.009"; 
$array['default_H17'] = "0.0236"; 
$array['default_K17'] = "50"; 
$array['default_P17'] = "0.0118"; 
$array['default_E19'] = "0.03"; 
$array['E19_default_test'] = "1.03"; 


echo "<pre>"; 

*您可以使用foreach *

$list = array(); 
foreach ($array as $key => $value) { 
    if (strpos($key, "default_") === 0) { 
     $list[$key] = $value; 
    } 
} 

var_dump($list); 

您還可以使用array_fliparray_filter

$array = array_flip(array_filter(array_flip($array),function($var) { return (strpos($var, "default_") === 0);})); 
var_dump($array); 

您還可以使用FilterIterator

class RemoveDefaultIterator extends FilterIterator { 
    public function accept() { 
     return (strpos($this->key(), "default_") === 0); 
    } 
} 

$list = new RemoveDefaultIterator(new ArrayIterator($array)); 
var_dump(iterator_to_array($list)); 

他們將所有輸出

array 
    'default_E17' => string '0.009' (length=5) 
    'default_H17' => string '0.0236' (length=6) 
    'default_K17' => string '50' (length=2) 
    'default_P17' => string '0.0118' (length=6) 
    'default_E19' => string '0.03' (length=4) 
+0

感謝您的幫助。我原本想過這個,但是想知道是否有比循環遍歷整個數組更有效的方法。它看起來不是! – BenM

+0

增加了另一個版本... – Baba

+0

請使用'==='查看更新後的代碼,因爲'=='可以在收到'boolean'響應時返回'0' – Baba

3
foreach($arr as $k => $v) { //iterate the array 
    if(strpos($k, 'default_') !== FALSE ) //search if the key contains 'default_' 
    $default_values[] = $v; // if so, store the values for the 'default_' keys 
} 
+0

冉代碼出於好奇,它不工作請參見http://codepad.viper- 7.com/9DjEKz。它返回不應該在列表中的「我的應用程序」 – Baba

+0

編輯條件檢查。 –

2

只是遍歷你的數組

Foreach($inputArray AS $key=>$val) { 
    // check if key is the one we need 
    if(...) { 
    // it is - deal with it 
    } 
} 

根據您使用if()可以簡單substr()或正則表達式匹配的密鑰。

1
foreach ($your_array as $key => $value) { 
    // check if the $key starst with 'default_' 
    if (substr($key, 0, 8) == "default_") { 
     //do your thing... 
     echo "<input type='text' value='" . $value . "'>"; 
    } 
    } 
2

可以使用FilterIterator這一點。

它與循環整個陣列的過程基本相同,因爲這是唯一的方法,但它可以避免在生產循環中執行此操作,從而減少噪音。

方法如下:你

class Default_FilterIterator extends FilterIterator 
{ 
    public function accept() 
    { 
     if (strpos($this->key(), 'default') === 0) { 
     return true; 
     } 
     return false; 
    } 
} 


$yourArray = array('default_stuff' => 'foo', 'otherstuff' => 'bar'); 

$filterdArray = new Default_FilterIterator(new ArrayIterator($yourArray)); 

foreach ($filteredArray as $key => $value) { 
    //deal only with default values here 
} 
+0

+1是知道我在想什麼 – Baba