2011-06-07 81 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.';