在PDOStatement :: fetchAll()之后将php函数应用于一列

时间:2016-03-15 06:12:12

标签: php mysql twig

假设我有这段代码:

<?php
$sth = $dbh->prepare("SELECT name, colour FROM fruit");
$sth->execute();

/* Fetch all of the remaining rows in the result set */
print("Fetch all of the remaining rows in the result set:\n");
$result = $sth->fetchAll();
print_r($result);
?>

输出:

Array
(
    [0] => Array
        (
            [name] => pear
            [0] => pear
            [colour] => green
            [1] => green
        )

    [1] => Array
        (
            [name] => watermelon
            [0] => watermelon
            [colour] => pink
            [1] => pink
        )

)

在此代码之前,我设计了以下简单函数:

function changecolour($data){
  if($data == 'pink'){ $data = 'red'; }
  return $data
}

问题: 如何仅使用键[colour]将该函数应用于数组(应用于数据库中的一列)并使用新列修复整个数组?另外,如果数组很大,那么您的方法可能会产生什么影响?如果你使用twig,你会建议如何在mysql表的一列上应用函数?

1 个答案:

答案 0 :(得分:1)

最快的方法是更新这样的查询:

SELECT name, IF(colour='pink','red',color) FROM fruit

另一方面,如果绝对需要使用所描述的功能,您可以这样做:

$result = array_map(function($row) {
    $row['color'] = changecolour($row['color']);
    return $row;
});

或使用foreach循环:

foreach ($result as &$row) {
        $row['color'] = changecolour($row['color']);
}

UPD :在第二个想法中,您可以为更广泛的案例添加新功能:

function apply_column($rows, $column, $function) {
    foreach ($rows as &$row) {
        $row[$column] = $function($row[$column]);
    }
    return $rows;
}

并使用它:

$result = apply_column($result, 'color', 'changecolour');