将父级tr的Parse(字符串)表解析为数组

时间:2015-03-10 13:38:56

标签: javascript php jquery html arrays

我有一个里面有桌子的字符串;我的问题是将父tr(根据他们的孩子)放入数组中(以后使用它并不重要,无论数组是一维还是多维) 该表如下所示:

<tr><td class="boys" colspan="4"></td></tr>
<tr><td class="indoor" colspan="4"></td></tr>
    <tr class="toy">
        <td class="article">Ball</td>
        <td class="color">Red</td>
        <td class="size">big</td>
        <td class="price">10</td>
    </tr>

    <tr class="toy">
        <td class="article">Puzzle</td>
        <td class="color">colored</td>
        <td class="size">medium</td>
        <td class="price">5</td>
    </tr>       

<tr><td class="outdoor" colspan="4"></td></tr>
    <tr class="toy">
        <td class="article">Inliner</td>
        <td class="color">black</td>
        <td class="size">5</td>
        <td class="price">15</td>
    </tr>

    <tr class="toy">
        <td class="article">Pool</td>
        <td class="color">white/blue</td>
        <td class="size">big</td>
        <td class="price">25</td>
    </tr>   

<tr><td class="all" colspan="4"></td></tr>
    <tr class="toy">
        <td class="article">Book</td>
        <td class="color">colored</td>
        <td class="size">small</td>
        <td class="price">2</td>
    </tr>

和女孩一样的tr / td构造。

使用

$html = str_get_html($e);

$toys= array();
foreach ( $html->find('tr[class=toy]') as $toy) {
 $item['article'] = trim($toys->find('td', 0)->plaintext);
 $item['color'] = trim($toys->find('td', 1)->plaintext);
 $item['size'] = trim($toys->find('td', 2)->plaintext);
 $item['price'] = trim($toys->find('td', 3)->plaintext);
 $toys[] = $item;
}

我怎样才能得到父母双方?所以该数组看起来像

[0] => Array
    (
        [sex] => boys
        [place] => indoor
        [article] => Puzzle
        [color] => colored
        [size] => medium
        [price] => 5
    )

尝试使用

$item['place'] = $toys->find('tr.toy', 0)->plaintext;

给出错误的结果......

1 个答案:

答案 0 :(得分:0)

你还没有发布完整的表格结构(也适用于女孩),所以我认为它看起来像这样:

<table id="products">
    <tr><td class="boys" colspan="4"></td></tr>
    <tr><td class="indoor" colspan="4"></td></tr>
    <tr class="toy">...</tr>

    <tr><td class="outdoor" colspan="4"></td></tr>
    <tr class="toy">...</tr>

    <tr><td class="girls" colspan="4"></td></tr>
    <tr><td class="indoor" colspan="4"></td></tr>
    <tr class="toy">...</tr>

    <tr><td class="outdoor" colspan="4"></td></tr>
    <tr class="toy">...</tr>
</table>

由于我想熟悉Simple DOM Parser Package,这对我来说是一个受欢迎的练习。我按原样保留代码。我希望省略解释不违反SO规则。因此,如果愤怒的管理员不同意,或者OP需要一些额外的信息,请在此处留下另一个答案,我将在未来提供。请考虑table-attribute id。

$ret = $html->find("table[id=products] tr");
$items = array();
$item = NULL;

foreach($ret as $r)
{
    echo "got in the loop<br>";

    $class = $r->getAttribute("class");

    echo "class: $class<br>";

    if (strlen(trim($class)) == 0)
    {
        echo "We have a <tr> without a class<br>";
        $td = $r->firstChild();
        $class = $td->getAttribute("class");

        echo "The &lt;td&gt;-child should either have class boys,girls, indoor or outdoor<br>";

        if (strcasecmp($class, "girls") == 0 ||
            strcasecmp($class, "boys") == 0)
        {
            $sex = $class;
            echo "It's a $sex<br>";
        }
        else
        {
            if (strcasecmp($class, "indoor") == 0 ||
                strcasecmp($class, "outdoor") == 0)
            {
                $place = $class;
                echo "Item is meant for $place-usage<br>";
            }
        }
    }
    else
    {
        $childs = $r->childNodes();
        $item = array();
        $item["place"] = $place;
        $item["sex"] = $sex;

        echo "Creating new item for $place-$sex<br>";

        foreach($childs as $child)
        {
            $class = $child->getAttribute("class");
            $item[$class] = $child->innertext;
            echo "Item attribute $class with ".$child->innertext."<br>";
        }
        array_push($items, $item);
     }
}
echo "<pre>";
print_r($items);
echo "</pre>";