2010-02-03 112 views
0

對模糊標題感到抱歉。我使用simple_html_dom從下面指定的設置中提取一些數據。我想要做的是將數據插入一個2D數組(?),其中第一個字段的值是訂閱的名稱,其餘的是與該訂閱相關的數據。使用foreach循環從數組創建2D陣列

<td><a href="/subname/index.jsp">SubName</a></td> <!-- This is the name of the subscription --> 
<td>Comment regarding the subscription</td><!-- Comment -->   
<td><strong>0,-</strong></td><!-- Monthly fee --> 
<td>0,49</td><!-- Price per minute --> 
<td>0,49</td><!-- Price per SMS --> 
<td>1,99</td><!-- Price per MMS --> 

我到目前爲止,工作正常,但它將所有的值放入一個常規數組中。 我已經嘗試閱讀數組,並嘗試不同的解決方案,但我只是似乎無法包裹我的頭。

我想是這樣的:

陣列 ( [SubName1] =>數組 ( [0] =>註釋 [1] =>每月費用 [2] =>價格,每分鐘 [3] =>單價SMS [4] =>單價MMS ) [SubName2] =>數組 (..)

這是我的代碼:

function getData($uri) { 
try { 
$html = file_get_html($uri); // Fetch source code 
$data = array(); 
foreach($html->find('td') as $td) { // Fetch all <td>-elements 

foreach($td->find('a') as $a) { // Fetch all <a>-elements to remove links 
    $data[] = $a->innertext; // This returns the names of the subscriptions 
} 
foreach($td->find('strong') as $strong) { // Fetch all <strong>-elements to remove bold text 
    $data[] = $strong->innertext; 
} 
if(!preg_match('/<strong>/', $td->innertext) && !preg_match('/<a/', $td->innertext)) { // Skip all <td>-elements that contains <strong> and <a>, since we already have them 
    $data[] = $td->innertext; 
} 
} 

/* Logic for database insertion goes here */ 

unset($data); // Deletes array 
$html->clear(); // Clear to free up memory 
unset($html); 
} catch (Exception $e) { 
echo 'Failed to fetch prices from'.$uri.'.<br />'.$e->getMessage(); 
} 
} 

在此先感謝。

+0

是HTML文檔XHTML嗎?如果是這樣,你可以使用PHP DOM擴展來解析代碼並構建一個數組。請參閱:http://php.net/manual/en/book.dom.php – Camsoft 2010-02-03 11:31:01

回答

0

如果我正確理解你的問題,這是你應該怎麼做的。

首先,我建議你捕捉每行而不是單個單元格,然後獨立解析每一行。

因此,在這個例子中,我假設你行被包裹在tr標籤:

<tr> 
<td><a href="/subname/index.jsp">SubName</a></td> <!-- This is the name of the subscription --> 
<td>Comment regarding the subscription</td><!-- Comment -->   
<td><strong>0,-</strong></td><!-- Monthly fee --> 
<td>0,49</td><!-- Price per minute --> 
<td>0,49</td><!-- Price per SMS --> 
<td>1,99</td><!-- Price per MMS --> 
</tr> 

如果有更多的細胞在一開始還是你只是必須相應地調整指數結束。此外,我還沒有測試過這個代碼,所以可能有一些錯誤,但一般的想法應該沒問題。

//here we will store parsed values 
$data = array(); 

// you may want to filter this a bit if you want some rows to be skipped 
foreach ($html->find('tr') as $tr) { 
    // we get first cell in the row, find a element inside and take it's inner text and so on 
    $name = $tr->children(1)->find('a')->innertext; 
    $comment = $tr->children(2)->innertext; 
    $monthyFee = $tr->children(3)->find('strong')->innertext; 
    $pricePerMin = $tr->children(4)->innertext; 
    $pricePerSms = $tr->children(5)->innertext; 
    $pricePerMms = $tr->children(6)->innertext; 

    // create new entry in $data array formatted as you wanted it 
    $data[$name] = array($comment, $monthlyFee, $pricePerMin, $pricePerSms, $pricePerMms); 
} 

重要提示在這裏 - 這不會妨礙你的情況下,覆蓋一些數據你的名字是不是唯一的,所以你必須確保它是否真的是。這是因爲關聯數組不能有多個具有相同值的鍵。

+0

謝謝,幾個推文後,它得到了工作。無法使用children(x) - 發現剝離和強壯,但使用「明文」而不是innertext解決了問題。謝謝 :) – Tom 2010-02-03 12:08:24