単純なテーブルから array に変換するコードを書いてみるテスト。
実はオリジナルはC# で作ったルーチンなんですがww

HTMLを渡すと、最初のテーブルをarrayに変換してくれます。
ライセンスはNYSLでどうぞご自由に。

//table タグを arrayに変換
//複雑なテーブルには未対応です。
//ArrayList[y] = {ArrayList[x]} 形式です.
function & TableToArray($inHTML)
{
	$y = array();

	//枝刈り
	$inHTML = str_replace("<TABLE", "<table",$inHTML);
	$inHTML = str_replace("<TR", "<tr",$inHTML);
	$inHTML = str_replace("</TR", "</tr",$inHTML);
	$inHTML = str_replace("<TD", "<td",$inHTML);
	$inHTML = str_replace("</TD", "</td",$inHTML);
	$inHTML = str_replace("<TH", "<td",$inHTML);		//TD扱い
	$inHTML = str_replace("</TH", "</td",$inHTML);
	$inHTML = str_replace("<th", "<td",$inHTML);
	$inHTML = str_replace("</th", "</td",$inHTML);
	
	$tableStart = strpos($inHTML , "<table");
	if ($tableStart === FALSE)
	{
		return $y;
	}
	$tableEnd = strpos($inHTML , "</table", $tableStart);
	if ($tableEnd === FALSE)
	{
		return $y;
	}
	$trLoop = $tableStart;
	while(true)
	{
		//TRタグ 行の取得
		$trStart = strpos($inHTML , "<tr", $trLoop);
		if ($trStart === FALSE)
		{
			break;
		}
		if ($trStart > $trLoop + $tableEnd - $trLoop)
		{
			break;
		}

		$trEnd = strpos($inHTML , "</tr>", $trStart);
		if ($trEnd === FALSE)
		{
			break;
		}
		if ($trEnd > $trStart + $tableEnd - $trStart)
		{
			break;
		}
		$trLoop = $trEnd + 1;

		//TDタグ 列の取得
		$x = array();
		$tdLoop = $trStart;
		while (true)
		{
			$tdStart = strpos($inHTML , "<td", $tdLoop);
			if ($tdStart === FALSE)
			{
				break;
			}
			if ($tdStart > $trEnd + $trEnd - $tdLoop)
			{
				break;
			}

			$tdEnd = strpos($inHTML , "</td>", $tdStart);
			if ($tdEnd === FALSE)
			{
				break;
			}
			if ($tdEnd > $tdStart + $trEnd - $tdStart)
			{
				break;
			}
			$tdLoop = $tdEnd + 1;

			//中身を保存.
			$node = substr($inHTML , $tdStart , $tdEnd - $tdStart);
			$x[] = KillTag($node);
		}
		$y[] = $x;
	}
	return $y;
}

function & KillTag($inHTML)
{
	$retString = "";
	$tagLoop = 0;

	while (true)
	{
		$tagStart = strpos($inHTML , '<', $tagLoop);
		if ($tagStart === FALSE)
		{
			break;
		}

		//タグが始まるまでのテキストの取り込み
		if ($tagStart - $tagLoop > 0)
		{
			$retString .= substr($inHTML , $tagLoop, $tagStart - $tagLoop);
		}
		$tagEnd = strpos($inHTML ,'>', $tagStart );;
		if ($tagEnd === FALSE)
		{
			break;  //タグを閉じていない??
		}
		$tagLoop = $tagEnd + 1;
	}

	return $retString;
}

オリジナルのC#版。

//table タグを Array に変換
//複雑なテーブルには未対応です。
//ArrayList[y] = {ArrayList[x]} 形式です.
ArrayList TableToArray(string inHTML)
{
    ArrayList y = new ArrayList();

    //枝刈り
    inHTML = inHTML.Replace("<TABLE", "<table");
    inHTML = inHTML.Replace("</TABLE", "</table");
    inHTML = inHTML.Replace("<TR", "<tr");
    inHTML = inHTML.Replace("</TR", "</tr");
    inHTML = inHTML.Replace("<TD", "<td");
    inHTML = inHTML.Replace("</TD", "</td");
    inHTML = inHTML.Replace("<TH", "<td");   //TD扱いにする
    inHTML = inHTML.Replace("</TH", "</td"); //TD扱いにする
    inHTML = inHTML.Replace("<th", "<td");   //TD扱いにする
    inHTML = inHTML.Replace("</th", "</td"); //TD扱いにする

    int tableStart = inHTML.IndexOf("<table");
    if (tableStart < 0)
    {
        return y;
    }
    int tableEnd = inHTML.IndexOf("</table>", tableStart);
    if (tableEnd < 0)
    {
        return y;
    }
    int trLoop = tableStart;
    while(true)
    {
        //TRタグ 行の取得
        int trStart = inHTML.IndexOf("<tr", trLoop, tableEnd - trLoop);
        if (trStart < 0)
        {
            break;
        }
        int trEnd = inHTML.IndexOf("</tr>", trStart, tableEnd - trStart);
        if (trEnd < 0)
        {
            break;
        }
        trLoop = trEnd + 1;

        //TDタグ 列の取得
        ArrayList x = new ArrayList();
        int tdLoop = trStart;
        while (true)
        {
            int tdStart = inHTML.IndexOf("<td", tdLoop, trEnd - tdLoop);
            if (tdStart < 0)
            {
                break;
            }
            int tdEnd = inHTML.IndexOf("</td>", tdStart, trEnd - tdStart);
            if (tdEnd < 0)
            {
                break;
            }
            tdLoop = tdEnd + 1;

            //中身を保存.
            string node = inHTML.Substring(tdStart , tdEnd - tdStart);
            x.Add(KillTag(node));
        }
        y.Add(x);
    }
    return y;
}
string KillTag(string inHTML)
{
    string retString = "";
    int tagLoop = 0;

    while (true)
    {
        int tagStart = inHTML.IndexOf('<', tagLoop);
        if (tagStart < 0)
        {
            break;
        }
        //タグが始まるまでのテキストの取り込み
        if (tagStart - tagLoop > 0)
        {
            retString += inHTML.Substring(tagLoop, tagStart - tagLoop);
        }
        int tagEnd = inHTML.IndexOf('>', tagStart);
        if (tagEnd < 0)
        {
            break;  //タグを閉じていない??
        }
        tagLoop = tagEnd + 1;
    }

    return retString;
}