У меня есть массив ниже с одними и теми же ключами с разными значениями.Как я могу объединить одинаковые значения ключей с этим ключом в PHP?Я использую WAMP, Codeigniter - PullRequest
0 голосов
/ 18 октября 2018

Я получаю эти данные при импорте файла CSV.В CSV-файле у меня 1-й столбец - Годы, а все остальные столбцы - Марка.Я использую библиотеку csvreader для анализа данных из файла CSV.

Моя библиотека CSVReader.

class CI_Csvreader {

    var $fields;        /** columns names retrieved after parsing */  
    var $separator = ',';    /** separator used to explode each line */  

    /** 
     * Parse a text containing CSV formatted data. 
     * 
     * @access    public 
     * @param    string 
     * @return    array 
     */  
    function parse_text($p_Text) {  
            $lines = explode("\n", $p_Text);  
            return $this->parse_lines($lines);  
    }  

    /** 
     * Parse a file containing CSV formatted data. 
     * 
     * @access    public 
     * @param    string 
     * @return    array 
     */  
    function parse_file($p_Filepath) {  
            $lines = file($p_Filepath);  
            return $this->parse_lines($lines);  
    }  
    /** 
     * Parse an array of text lines containing CSV formatted data. 
     * 
     * @access    public 
     * @param    array 
     * @return    array 
     */  
    function parse_lines($p_CSVLines) {  
            $content = FALSE;  
            foreach( $p_CSVLines as $line_num => $line ) {  
                    if( $line != '' ) { // skip empty lines  
                            $elements = explode($this->separator, $line);  

                            if( !is_array($content) ) { // the first line contains fields names  
                                    $this->fields = $elements;  
                                    $content = array();  
                            } else {  
                                    $item = array();  
                                    foreach( $this->fields as $id => $field ) {  
                                            if( isset($elements[$id]) ) {  
                                                    $item[$field] = $elements[$id];  
                                            }  
                                    }  
                                    $content[] = $item;  
                            }  
                    }  
            }  
            return $content;  
    }

Данные моего файла CSV =>

Years   Make    Make    Make
2001    Acura   Honda   Toyota
2002    Acura   Honda   
2003    Acura           Toyota
2004                          

В указанном файле Годыи Сделать данные в листе Excel / CSV можно позже.

Мой вывод - это массив. =>

Array
(
    [0] => Array
        (
            [Years] => 2001
            [Make] => Acura
            [Make] => Honda
            [Make] => Toyota
        )

    [1] => Array
        (
            [Years] => 2002
            [Make] => Acura
            [Make] => Honda
            [Make] => 
        )
    [2] => Array
        (
            [Years] => 2003
            [Make] => Acura
            [Make] => 
            [Make] => Toyota
        )
    [3] => Array
        (
            [Years] => 2004
            [Make] => 
            [Make] => 
            [Make] => 
        )
)

Я хочу, чтобы мой массив результатов был таким => Я хочу оставить нользначения.

Array
(
    [0] => Array
        (
            [Years] => 2001
            [Make] => Array(
                              [0]=>Acura
                              [1]=>Honda
                              [2]=>Toyota
                           )
        )

    [1] => Array
        (
            [Years] => 2002
            [Make] => Array(
                              [0]=>Acura
                              [1]=>Honda
                              [2]=>
                           )
        )
    [2] => Array
        (
            [Years] => 2003
            [Make] => Array(
                              [0]=>Acura
                              [1]=>
                              [2]=>Toyota
                           )
        )
    [3] => Array
        (
            [Years] => 2004
            [Make] => Array(
                              [0]=>
                              [1]=>
                              [2]=>
                           )
        )
)

Также, пожалуйста, покажите мне, как получить результат без нулевых значений.

Если есть какой-либо другой способ получить данные из файла CSV в моем желаемом формате, который будет в порядке.

Может кто-нибудь, пожалуйста, помогите мне.Большое спасибо.

1 Ответ

0 голосов
/ 19 октября 2018

Вы можете использовать эту функцию для анализа вашего CSV-файла.

function CSV_parse($string='', $has_header=true, $row_delimiter=PHP_EOL, $delimiter = "," , $enclosure = '"' , $escape = "\\" )
{
    $rows = array_filter(explode($row_delimiter, $string));
    $firstline = true;
    $data = array();

    foreach($rows as $row)
    {
        if($firstline && $has_header)
        {
            $firstline=false;
            continue;
        }

        $row = str_getcsv ($row, $delimiter, $enclosure , $escape);


        $dtrow=array('Years'=>$row[0], 'Makes'=>array());
        for($i=1;$i<count($row);$i++)
        {
            $make=trim($row[$i]);
            if($make=='')continue;
            $dtrow['Makes'][]=$make;
        }
        $data[] =$dtrow;

    }

    return $data;
}

Вы должны передать в качестве первого аргумента содержимое файла CSV.для второго аргумента вы должны передать false, если ваш CSV-файл не имеет заголовка

EDIT ==>

Вы можете изменить всего несколько строк в этом классе для достижения желаемых результатов.Посмотрите на эти строки между PTK ==> и <== PTK: </p>

class CI_Csvreader {

    var $fields;        /** columns names retrieved after parsing */  
    var $separator = ',';    /** separator used to explode each line */  

    /** 
     * Parse a text containing CSV formatted data. 
     * 
     * @access    public 
     * @param    string 
     * @return    array 
     */  
    function parse_text($p_Text) {  
            $lines = explode("\n", $p_Text);  
            return $this->parse_lines($lines);  
    }  

    /** 
     * Parse a file containing CSV formatted data. 
     * 
     * @access    public 
     * @param    string 
     * @return    array 
     */  
function parse_file($p_Filepath) {  
        $lines = file($p_Filepath);  
        return $this->parse_lines($lines);  
}  
/** 
 * Parse an array of text lines containing CSV formatted data. 
 * 
 * @access    public 
 * @param    array 
 * @return    array 
 */  
function parse_lines($p_CSVLines) {  
        $content = FALSE;  
        foreach( $p_CSVLines as $line_num => $line ) {  
                if( $line != '' ) { // skip empty lines  
                        $elements = explode($this->separator, $line);  

                        if( !is_array($content) ) { // the first line contains fields names  
                                $this->fields = $elements;  
                                $content = array();  
                        } else {  

                                //PTK: ==> new code
                                $item=array('Years'=>$elements[0], 'Makes'=>array());
                                for($i=1;$i<count($elements);$i++)
                                {
                                    $make=trim($elements[$i]);
                                    //if($make=='')continue;  //PTK: if you want to remove empty lines uncoment this line, but in this case your array may will have rows with different     lengthes
                                    $item['Makes'][]=$make;
                                }
                                //PTK: <== new code
                                /* 
                                //PTK ==> original code
                                $item = array();  
                                foreach( $this->fields as $id => $field ) {  
                                        if( isset($elements[$id]) ) {  
                                                $item[$field] = $elements[$id];  
                                        }  
                                } 
                                //PTK <== original code
                                */ 
                                $content[] = $item;  
                        }  
                }  
        }  
        return $content;  
}
...