php将基本数组转换为基于元素序列的数组,数组解析

时间:2014-05-02 16:30:43

标签: php arrays

我使用simple_html_dom.php来创建一个td元素值数组。我想把这个数组重新组织成我可以工作的东西,而不仅仅是一个简单的列表。

数组看起来像这样(我缩短了要简化的属性数量):

ret[0] = 1       // player position
ret[1] = Tiger Woods  // player name
ret[3] = 68    // score
ret[4] = 2     // start of second record, player #2 position
ret[5] = Phil Mickleson // player #2 name
ret[6] = 69     // player #2 score

我想把它变成另一个数组:

$ret['position'] = 1,2
$ret['name'] = Tiger Woods, Phil Mickleson
$ret['score'] = 68, 69

我如何处理:元素0,4并将它们放置到位 元素1,5并将它们放入名称中 元素6,3并将它们放入分数

每条记录包含相同数量的属性。请考虑我的完整属性列表是10而不是3,如上所示。

这是我到目前为止的实际代码,它可以工作,并将给出我正在使用的数组。我愿意接受任何更好地利用simple_html_dom.php的解决方案

$html = file_get_html('http://sports.yahoo.com/golf/pga/leaderboard');

// Use simple_html_dom to find all td elements as an array

$ret = $html->find('td');

// Code to remove all unwanted td elements from the array

unset($ret[0]);
unset($ret[1]);
$rem=count($ret)-1;
unset($ret[$rem]);

// Code to display all values in the array

foreach($ret as $value){
echo $value . '<br>';
}

非常感谢!

布莱恩

4 个答案:

答案 0 :(得分:0)

$newret = array_combine (
    array('position', 'name', 'score'),
    call_user_func_array(
        'array_map',
        array_merge(array(NULL),array_chunk($ret, 3))
    )
);
var_dump($newret);

修改

如果您想要逗号分隔列表而不是嵌套数组:

$newret = array_map(
    function ($value) { return implode(', ', $value); },
    array_combine (
        array('position', 'name', 'score'),
        call_user_func_array(
            'array_map',
            array_merge(array(NULL),array_chunk($ret, 3))
        )
    )
);

var_dump($newret);

答案 1 :(得分:0)

遍历表格的行,而不是所有的TD。

$ret = array('position' => array(),
             'name' => array(),
             'score' => array());
$rows = $html->find('table.sportsTable tbody tr');
foreach ($rows as $row) {
    $cells = $row->find('td');
    $ret['position'][] = $cells[0]->plaintext;
    $ret['name'][] = $cells[1]->plaintext;
    $ret['score'][] = $cells[2]->plaintext;
}

$ret['position'] = implode(', ', $ret['position']);
$ret['name'] = implode(', ', $ret['name']);
$ret['score'] = implode(', ', $ret['score']);

答案 2 :(得分:0)

最终代码:

<!DOCTYPE html>
<html>
<body>

<?php include 'simple_html_dom.php'; ?>

<?php

// Create DOM from Yahoo Sports URL
$html = file_get_html('http://sports.yahoo.com/golf/pga/leaderboard');

$ret = array('position' => array(),
             'name' => array(),
             'rd_one_score' => array());
$rows = $html->find('table.sportsTable tbody tr');

$count = 0;
foreach ($rows as $row) {
    $cells = $row->find('td');
    $ret['position'][] = $cells[0]->plaintext;
    $ret['name'][] = $cells[1]->plaintext;
    $ret['rd_one_score'][] = $cells[2]->plaintext;
    $count = $count+1;

}

// Build table form array

echo "<table>";
echo "<tr><td>Position</td><td>Name</td><td>Score</td></tr>";
for ($x=1; $x<=$count; $x++) {
echo "<tr><td>",  $ret['position'][$x], "</td>";
echo "<td>",  $ret['name'][$x],  "</td>";
echo "<td>",  $ret['rd_one_score'][$x],  "</td></tr>";
} 
echo "</table>";


?>


</body>
</html>

答案 3 :(得分:0)

让我们想象simple_html_dom是it should have been的文库:

$dom = file_get_html('http://sports.yahoo.com/golf/pga/leaderboard');
$ret = array();
$ret['position'] = implode(',', $dom->find('.sportsTable tbody tr td:eq(1)')->trim_texts);
$ret['name'] = implode(',', $dom->find('.sportsTable tbody tr td:eq(2)')->trim_texts);
$ret['score'] = implode(',', $dom->find('.sportsTable tbody tr td:eq(3)')->trim_texts);

var_dump($ret);