2016-01-27 67 views
0

我有unix磁盤輸出,我想要轉換成每行相關數組,因此用戶可以選擇可用磁盤用於下一個vg創建。PHP陣列的字符串分列到關聯數組

當前數組項的輸出。每列之間只有一個空白區域,我只是做了一些標籤,因此它更易於閱讀。

array(11) { 
[0]=> string(141) "vg1    LVM 136G /dev/cciss/c0d0p2  N/A        N/A  LOCAL N/A N/A  NO " 
[1]=> string(141) "vg2    LVM 1G  /dev/mapper/mpath28p1 60060e80166fa70000016fa700000013 /dev/dm-33 R700 LS1000 0013 YES " 
[2]=> string(141) "vg3    LVM 60G /dev/mapper/mpath27p1 60060e80166fa70000016fa700000012 /dev/dm-34 R700 LS1000 0012 YES " 
[3]=> string(141) "vg4    LVM 60G /dev/mapper/mpath29p1 60060e80166fa70000016fa700000014 /dev/dm-35 R700 LS1000 0014 NO " 
[4]=> string(141) "***AVAILABLE*** FREE 2G  /dev/mapper/mpath21p1 60060e80167220000001722000000048 /dev/dm-37 R700 LS2000 0048 YES " 
[5]=> string(141) "***AVAILABLE*** FREE 2G  /dev/mapper/mpath22p1 60060e80167220000001722000000049 /dev/dm-36 R700 LS2000 0049 YES " 
[6]=> string(141) "***AVAILABLE*** FREE 90G /dev/mapper/mpath23p1 60060e80166fa70000016fa70000000e /dev/dm-31 R700 LS1000 000e YES " 
[7]=> string(141) "***AVAILABLE*** FREE 90G /dev/mapper/mpath24p1 60060e80166fa70000016fa70000000f /dev/dm-39 R700 LS1000 000f YES " 
[8]=> string(141) "***AVAILABLE*** FREE 90G /dev/mapper/mpath25p1 60060e80166fa70000016fa700000010 /dev/dm-30 R700 LS1000 0010 YES " 
[9]=> string(141) "***AVAILABLE*** FREE 90G /dev/mapper/mpath26p1 60060e80166fa70000016fa700000011 /dev/dm-32 R700 LS1000 0011 YES " 
[10]=> string(141) "***AVAILABLE*** FREE 2G  /dev/mapper/mpath30p1 60060e80167220000001722000000047 /dev/dm-38 R700 LS2000 0047 YES " 

我想這樣做結束了這樣的事情。我一直在嘗試不同的foreach循環,但還沒有得到它的工作。任何幫助/建議表示讚賞。

[0] => name=>vg1 type=>LVM lun_size=>136G mpath_name=>/dev/cciss/c0d0p2 flun_id=>N/A dm_name=>N/A array_type=>LOCAL array_name=>N/A lun_id=>N/A shared=>NO 
[1] => name=>vg2 type=>LVM lun_size=>1G mpath_name=>//dev/mapper/mpath28p1 flun_id=>60060e80166fa70000016fa700000013 dm_name=>/dev/dm-33 array_type=>R700 array_name=>LS1000 lun_id=>0013 shared=>NO 
[2] => ....etc 

感謝

回答

0

的解決方案是:

  • 遍歷原始數組元素
  • 使用explode()函數來分割字符串在(鍵,值)對
  • 存儲元件在一個臨時數組
  • 推臨時數組放在原始數組的適當位置。

所以,你的代碼應該是這樣的:

// suppose $arr is your original array 
$arrLength = count($arr); 
for($i = 0; $i < $arrLength; ++$i){ 
    $component_arr = explode(" ", $arr[$i]); 
    $tmp_arr = array(); 
    $tmp_arr['name'] = $component_arr[0]; 
    $tmp_arr['type'] = $component_arr[1]; 
    $tmp_arr['lun_size'] = $component_arr[2]; 
    $tmp_arr['mpath_name'] = $component_arr[3]; 
    $tmp_arr['flun_id'] = $component_arr[4]; 
    $tmp_arr['dm_name'] = $component_arr[5]; 
    $tmp_arr['array_type'] = $component_arr[6]; 
    $tmp_arr['array_name'] = $component_arr[7]; 
    $tmp_arr['lun_id'] = $component_arr[8]; 
    $tmp_arr['shared'] = $component_arr[9]; 

    unset($arr[$i]); 
    $arr[$i] = $tmp_arr; 
} 

// display $arr array 
var_dump($arr); 
+0

我確實在每列之間都有差異空間。取決於列的長度。修正了首先通過使所有空格= 1。然後不得不修剪每行的尾隨空白。感謝大家的幫助。正是我需要的。 – debow

0

如果他們是標籤,你應該能夠使用:

foreach($array as $row) { 
    $pieces = explode("\t",$row); 
} 
+0

它們不是標籤。它們只是空間序列。 – Barmar

+0

我一定誤解了你的問題,我以爲你說過你添加了標籤。 – Pitchinnate

+0

這不是我的問題。我想他說他爲可讀性添加了標籤,他們在原始數據中並不存在。 – Barmar

0

如果是準確的列僅由1個空格分隔,我可以一起提出好的建議的行:

$result = Array(); 
foreach($main_array as $string){ 
    $array = explode(" ", $string); 
    //now here you can sort them in the new array however you wish with the appropriate index and value. 
} 

通過空間爆炸 「」,而不是選項卡, 「\ t」 的

0

分揀出來的問題。以下給我這個。我不確定是否需要現在使用另一個foreach內的某種組合。我一直在看例子,但沒有發現任何與這些字段有關的字符串。

foreach($disks as $row){ 
       $arraynew = explode("\t", $row); 
       print_r($arraynew); 

      } 
Array ([0] => vg00 LVM 136G /dev/cciss/c0d0p2 N/A N/A LOCAL N/A N/A NO)  
Array ([0] => vg01 LVM 1G /dev/mapper/mpath28p1 60060e80013 /dev/dm-33 R700 LS4P991 0013 YES) 
+0

然後他們不像你說的標籤 – Pitchinnate