多维数组=> CakePHP中的CSV导出

时间:2014-08-27 05:11:59

标签: php sql cakephp csv cakephp-2.0

我试图将我的模型和两个相关模型中的数据导出到我的CakePHP 2.4应用程序中的CSV文件中,并且需要一些帮助,以计算上非昂贵的方式进行。

在我的应用中,每个Post hasMany Field和每个Field belongsTo Fieldtype. Fields存储值,Fieldtype存储值类型(IE"氧气浓度") 。在每个Post上,可以有多个Fields具有相同的Fieldtype.

此处生成CSV的问题是,每个帖子的字段都需要不同数量的列,因此当我执行fputcsv时,我需要添加空当任何Post小于最大字段数时,例如,氦气,以便标题排列。

是否有SQL解决方案以某种方式让我在我的帖子上进行连接查找并返回一个Fieldtypes数组,其中包含每个Fieldtype所需的最大字段数?

我的数据库结构:

Posts
id

Fields
id    post_id    fieldtype_id    value

Fieldtypes
id    name

1 个答案:

答案 0 :(得分:0)

我无法找到一种简单的方法来获取SQL中的字段数,并且因为事实证明在PHP中执行它不会慢,因为它不像我正在访问每次数据库。

如果有其他人必须处理这个问题,我就是这样做的:

//Where $posts is my array of Posts and $fieldtypes is an id => name array of my column types
public function makeCSV($posts = array(), $fieldtypes = array()){
    $fields = array();
    $fieldlist = array();
    foreach($posts as $post){
        foreach($post['Field'] as $field){
            if($field['value'] != ''){
                $fields[] = $field['fieldtype_id'];
                $fieldlist[$field['fieldtype_id']] = null;
            }
        } //Get a list of all the fields for that post

        $postcount = array_count_values($fields);
        $fields = array();

        // get a per-post count of fields

        foreach($postcount as $id => $count){
            if ($count > $fieldlist[$id] || !isset($fieldlist[$id])){
                $fieldlist[$id] = $count;
            }
        }
    }

        $output = null;     
        $output .= "Latitude" . ",";
        $output .= "Longitude" . ",";
        $output .= "Sighted (UTC)" . ",";
        $output .= "Posted (UTC)" . ",";
        $output .= "User" . ",";
        $output .= "Location" . ",";
        $output .= "Tags" . ",";
        $output .= "Category" . ",";
        $output .= "Species status" . ",";
//      $output .= "Comments" . ",";

    foreach ($fieldlist as $fieldtype => $count){
        $total = $count;
        while($count != 0){
            $output .= $fieldtypes[$fieldtype] . " " . ($total + 1 - $count)  . ",";
            --$count;
        }
    }
        $output = $output . "\n";

    foreach ($posts as $post) {
        $output = $output . addslashes($post['Post']['lat']) . "," . addslashes($post['Post']['lng']) . ",";
        $output = $output . "\"" . addslashes($post['Post']['sighted']) . "\"" . ",";
        $output = $output . "\"" . addslashes($post['Post']['created']) . "\"" . ",";
        $output = $output . "\"" . addslashes($post['User']['username']) . "\"" . ",";
        $output = $output . "\"" . addslashes($post['Post']['location']) . "\"" . ",";
        $output = $output . "\"" . addslashes($post['Post']['tags']) . "\"" . ",";
        $output = $output . addslashes($post['Post']['category']) . ",";
        if ($post['Post']['status'] == 1) {
            $output .= "Present,";
        } elseif($post['Post']['status'] == 2) {
            $output .= "Recently Appeared,";
        } elseif ($post['Post']['status'] == 3) {
            $output .= "Disappeared,";
        }
        else {
            $output .= ",";
        }
//      $output = $output . "\"" . addslashes(str_replace(array("\n", "\t", "\r"), '', $post['Post']['body'])) . "\"" . ",";

        foreach ($fieldlist as $fieldtype => $count){
            foreach($post['Field'] as $field){
                if($field['fieldtype_id'] == $fieldtype){
                    $output .= $field['value'] . ",";
                    --$count;
                }
            }
            while ($count > 0){
                $output .= ",";
                --$count;
            }
        }
        $output = $output . "\n";   
    }
    return $output; 
}