2013-09-24 48 views
1

我有一個線的PHP:把了shell_exec()輸出到數組

$output = shell_exec('ps aux | grep 9902 | awk \'{print $11" "$2}\''); 

print $output;將給輸出:

rtmpgw 10089 
/usr/bin/vlc 10107 
sh 1
grep 10125 

我試圖使用這個下一行把上述輸出成陣列。

$oparray = explode(" ", trim($output)); 

它的工作原理,但不是預期的。 print_r($oparray);將提供以下的輸出:

Array 
(
    [0] => rtmpgw 
    [1] => 10089 
/usr/bin/vlc 
    [2] => 10107 
sh 
    [3] => 1
grep 
    [4] => 10125 
) 

這混淆了我,因爲我所期望的索引號爲每個值,但三個值似乎是沒有指標。

,所以我想在這裏我的問題是兩個部分

  1. 什麼是輸出去上面
  2. 誰能幫助我得到一個有用的陣列看起來像這樣:

    陣列
    ( [0] => rtmpgw [1] => 10089 [2] =>的/ usr/bin中/ VLC [3] => 10107 [4] => SH [5] => 1 [6] =>的grep [7] => 10125 )

感謝〜

回答

4

shell_exec輸出的線由end-of-line符號分離 - 這是不同於普通的空格,這就是爲什麼explode沒有考慮到它。

您可以使用preg_split代替\s字符類匹配均爲正常空格和EOL。

$oparray = preg_split('/\s+/', trim($output)); 
+0

完美陣列。簡單的解決方案,效果很好非常感謝。 – BryanK

+0

這個解決方案對於那些包含空格的輸出名稱不起作用!例如像** Hello world **這樣的文件名,這個解決方案將會創建'[0] => ['Hello','world']' – Ibrahim

1
$array = array(); 
foreach(preg_split("/((\r?\n)|(\r\n?))/", $subject) as $line){ 
    $oparray = explode(" ", trim($line)); 
    $array[] = $oparray[0]; 
    $array[] = $oparray[1]; 
} 
+2

只需要一個指針,你不需要聲明'$ array' if你正在使用'[] =' – andy

+0

確實你不需要Array(),但我經常包含它以確保變量是空的。 – Manu

4

試試這個:

<?php 
$text = 'rtmpgw 10089 
/usr/bin/vlc 10107 
sh 1
grep 10125'; 

$oparray = preg_split("#[\r\n]+#", $text); 

print_r($oparray); 
?> 
Array 
(
    [0] => rtmpgw 10089 
    [1] => /usr/bin/vlc 10107 
    [2] => sh 1
    [3] => grep 10125 
) 
+1

這是完美的解決方案! – Ibrahim