亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從一維數組創建關聯數組

從一維數組創建關聯數組

PHP
飲歌長嘯 2021-06-11 22:33:01
不太確定問題的標題應該在這里...示例 .csv:tennis,soccer,sportscar,plane,thingsjeans,shirt,things我的最終理想結果應該是一個如下所示的數組:Array(    [sports] => Array        (            [0] => tennis            [1] => soccer        )    [things] => Array        (            [0] => car            [1] => plane            [2] => jeans            [3] => shirt        ))這是我最近嘗試實現上述結果(經過多次嘗試):<?php$f_name = 'test.csv';// Stores all csv data$csv_data = array_map('str_getcsv', file($f_name));$c = count($csv_data);$tmp = array();$data_for_email = array();for ($i = 0; $i < $c; $i++) {    // Remove last element and make it a key    $le = array_pop($csv_data[$i]);    $tmp[$le] = $csv_data[$i];    $data_for_email = array_merge_recursive($data_for_email, $tmp); // MEMORY ERROR}print_r($data_for_email);?>這就是我得到的結果:Array(    [sports] => Array        (            [0] => tennis            [1] => soccer            [2] => tennis            [3] => soccer            [4] => tennis            [5] => soccer        )    [things] => Array        (            [0] => car            [1] => plane            [2] => jeans            [3] => shirt        ))如您所見,我在[sports]數組中得到了 .csv 的第 1 行的重復項。我的要求的更詳細描述:每行有 3 個字段。第三個字段成為key新關聯數組中的 a。其余兩個字段(第1次和第2次)成為values該key。因為多行可能(并且確實)包含相同的第三個字段(而第一個和第二個字段的組合總是不同的),所以我需要將所有這些重復鍵的值合并為 1。PS我之后可以解析該數組(以刪除重復值),但真正的.csv文件很大并且處理它變得太慢,并且在我標記的行中收到以下錯誤// MEMORY ERROR:致命錯誤:允許的內存大小為 134217728 字節已用盡我嘗試增加內存限制,但如果可能的話,我更愿意避免這種情況。
查看完整描述

3 回答

?
蕭十郎

TA貢獻1815條經驗 獲得超13個贊

應該會輕松一些。不需要array_merge_recursive:


foreach($csv_data as $row) {

    $key = array_pop($row);

    if(!isset($data_for_email[$key])) {

        $data_for_email[$key] = [];

    }

    $data_for_email[$key] = array_merge($data_for_email[$key], $row);

}


查看完整回答
反對 回復 2021-06-19
?
幕布斯7119047

TA貢獻1794條經驗 獲得超8個贊

更高的內存效率將是:

  1. 不讀取內存中的整個文件。fgetcsv一次讀取一行

  2. 避免遞歸合并

代碼:

$handle = fopen($f_name, 'r');

if (!$handle) { 

    // Your error-handling

    die("Couldn't open file");

}


$data_for_email = array();

while($csvLine = fgetcsv($handle)) {

    // Remove last element and make it a key

    $le = array_pop($csvLine);

    if (isset($data_for_email[$le])) {

        $data_for_email[$le] = array_merge($data_for_email[$le], $csvLine);

    } else {

        $data_for_email[$le] = $csvLine;

    }

}


fclose($handle);


查看完整回答
反對 回復 2021-06-19
?
白衣非少年

TA貢獻1155條經驗 獲得超0個贊

我也做了一些東西,但現在其他的更快了。:D 我已經做到了,它并沒有完全符合您的要求,但也許它可以進一步幫助您。


不幸的是,我現在沒有再進一步了,無論如何都想向您展示它:)


這是您的 index.php (或任何文件被調用。)


<?php

include "Data.php";


$f_name = 'in.csv';

// Stores all csv data

$csv_data = array_map('str_getcsv', file($f_name));

$c = count($csv_data);


$tmp = array();

$data_for_email = array();


foreach ($csv_data as $data){

    $key = array_pop($data);

    array_push($data_for_email,new Data($data,$key));

}

foreach ($data_for_email as $data){

    array_push($tmp,$data->getValue());

}


foreach ($tmp as $value){

    print_r($value);

    echo "<br>";

}

這里是類數據:


<?php



class Data

{

    private $value = [];


    public function __construct($data, $key)

    {

        $this->value[$key]=$data;

    }


    /**

     * @return array

     */

    public function getValue()

    {

        return $this->value;

    }

}

作為輸出,你變成了這樣的東西:


Array ( [sports] => Array ( [0] => tennis [1] => soccer ) ) 

Array ( [things] => Array ( [0] => car [1] => plane ) ) 

Array ( [things] => Array ( [0] => jeans [1] => shirt ) ) 

ps:當然還有另一個函數可以總結相同的鍵,但不知何故我現在什么都沒找到......我希望它有幫助:)


查看完整回答
反對 回復 2021-06-19
  • 3 回答
  • 0 關注
  • 177 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號