Foreach-döngüler ile diziden 2D-dizi oluşturma

1 Cevap php

belirsiz başlık için üzgünüm. Simple_html_dom kullanarak, aşağıda belirtilen şekilde ben kurulum ile bir tablodan bazı verileri ayıklayarak ediyorum. Ne yapmak istediğinizi bir 2D-diziye veri eklemek olduğunu (?), Ilk alanın değeri bir abonelik adı ve dinlenme bu abonelik ile ilgili veri olduğu.

<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 -->

What I have so far, is working okay, but it puts all the values into a regular array. I've tried reading up on arrays and trying different solutions that've come to mind, but I just can't seem to wrap my head around it.

İstediğim gibi bir şeydir:

Array ( [SubName1] => Array ( [0] => Comment [1] => Monthly fee [2] => Price per minute [3] => Price per SMS [4] => Price per MMS ) [SubName2] => Array ( .. )

Bu benim kodudur:

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();
}
}

Şimdiden teşekkürler.

1 Cevap

Sorunu doğru anlamak, bu bunu nasıl olduğunu.

Öncelikle ben yerine, tek tek hücrelerin her satırı yakalamak ve daha sonra bağımsız olarak her satır ayrıştırmak öneririz.

Yani bu örnekte ben size satır tr etiketleri sarılı olduğunu varsayalım:

<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>

Başında veya sonunda daha fazla hücre varsa sadece buna göre dizinleri ayarlamak zorunda kalacak. Ayrıca ben bu kodu test sığınak yani orada bazı hatalar olabilir ama genel bir fikir Tamam olmalıdır.

//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);
}

Burada Önemli not - bu yüzden gerçekten olup olmadığından emin olmalıdır adınız benzersiz olmaması halinde bazı verileri yazmasını engel olmaz. Ilişkisel diziler aynı değere sahip birden tuşları olamaz çünkü bu.