2011-06-07 78 views
2

如果我有一個數組$輸出,看起來像這樣,我怎麼能搜索數組並回顯持續時間值,在這種情況下是30.持續時間並不總是鍵[18]。包含「鍵:值」項目的PHP搜索數組

Array 
(
    [16] =>  hasKeyframes : true 
    [17] =>  hasMetadata  : true 
    [18] =>  duration  : 30 
    [19] =>  audiosamplerate : 22000 
    [20] =>  audiodatarate : 68 
    [21] =>  datasize  : 1103197 
} 
+6

你容易得多,如果你重新/構建您的陣列正確 – 2011-06-07 07:29:49

+0

@Lawrence這是從做'EXEC('的ffmpeg -i視頻產生的陣列。 flv',$ output);'我沒有這樣做 – Pinkie 2011-06-07 07:31:15

+2

但你可以通過循環爆炸(':',$ output [$ i])來重建它。 – 2011-06-07 07:32:58

回答

1
$array=preg_grep("/duration/", $output); 
$array=implode(",",$array); 
$key_value=explode(":",$array); 
echo $key_value[1]; 
+0

這是行不通的。代碼中的'$ array'是什麼。我的數組名稱是$輸出。 – Pinkie 2011-06-07 07:43:44

+0

@Pinkie:看我的編輯 – 2011-06-07 07:45:37

+0

謝謝,它的工作原理。所有其他答案都是有效的,但這是簡短而乾淨的。順便說一句,你犯了一個錯誤'$輸出))'。它應該是'$輸出)' – Pinkie 2011-06-07 07:51:24

5

試試這個功能:

function search_value($array, $key, $default_value = false) 
{ 
    foreach($array as $value) 
    { 
     list($_key, $_val) = array_map('trim', explode(":", $value)); 
     if(strtolower($key) == strtolower($_key)) 
     return $_val; 
    } 
    return $default_value; 
} 

使用這樣

echo search_value($output, 'duration', 0); 

,就像@Lawrence指出,這將是MUCH容易如果你改變你的陣列結構:

$output= array(
    'hasKeyframes'=>true, 
    'hasMetadata'=>true, 
    'duration'=>'30', 
    . 
    . 
    . 
); 

這樣,你只需要檢查的關鍵存在和獲取價值:

echo (!array_key_exists('duration', $output) ? $output['duration'] : 0); 
+0

將我的評論讀回勞倫斯。這是'exec()'輸出數組的方式。在你的例子'search_value($ array,$ key)'什麼是'$ key'。我是否需要輸入。$ key是未知的。它是動態生成的。 – Pinkie 2011-06-07 07:40:20

+0

閱讀我的'使用它是這樣的:'部分 – ariefbayu 2011-06-07 07:43:07

2

我建議在第一次消毒數組:

$sanitized = array(); 

foreach($output as $value) { 
    $data = explode(':', $value); 
    $sanitized[trim($data[0])] = trim($data[1]); 
} 

echo $sanitized['duration']; 
0

燦」你讓它成爲關聯數組嗎?

Array 
(
    [hasKeyframes] => true 
    [hasMetadata] =>  true 
    [duration] =>  30 
    [audiosamplerate] => 22000 
    [audiodatarate] => 68 
    [datasize] =>  1103197 
} 

然後它會很簡單$arr['duration']

如果不是,您可以解析值,例如以同樣的方式發佈沉默的方式。

+0

沒有讀過我上面的評論。 – Pinkie 2011-06-07 07:40:48

+0

@Pinkie:我同意3小時前在評論中寫道:「但是你可以用爆炸(':',$ output [$ i])循環來重建它, – Xaerxess 2011-06-07 10:46:16

2

難道你不能讓它成爲關聯數組嗎?當然

他可以:

<?php 
$output = array(
    16 => 'hasKeyframes : true', 
    17 => 'hasMetadata  : true', 
    18 => 'duration  : 30', 
    19 => 'audiosamplerate : 22000' 
    20 => 'audiodatarate : 68', 
    21 => 'datasize  : 1103197' 
); 

foreach($output as $element) { 
    $values = array_map('trim', explode(':', $element)); 
    $assoc[$values[0]] = $values[1]; 
} 


echo isset($assoc['duration']) ? $assoc['duration'] : 'Duration not set.';