我正在開發 CSV 檔案上傳功能。整個腳本作業正常,我這樣做的方式是消除作為標題的 CSV 檔案的第一行,然后僅使用資料插入資料庫。但是,這增加了始終對 CSV 進行排序的限制。我也需要接受未排序的 CSV。例如,如果列name
在 CSV 檔案的第二列中,則陣列索引變為$arr[1]
. 目前,我$arr[1]
用于在資料庫中插入值并執行操作。這是不好的。如果用戶上傳了一個未排序的 CSV,其中name
位于第 4 列,并說phone
位于第 2 列,我之前期望的名稱是,那么這將破壞整個操作。因此,我如何使用第一個標題行并將它們用作鍵$arr['name']
執行所需的操作?
我當前的代碼:
$csvFile = fopen($_FILES['file']['tmp_name'], 'r');
fgetcsv($csvFile);
$arr = [];
while($data = fgetcsv($csvFile, 100, ",")){
$arr['id'] = $data[0]; // WANT TO USE $data['id'] FROM CSV FILE's FIRST LINE
$arr['date'] = date('Y-m-d', strtotime($data[1])); // WANT TO USE $data['date'] FROM CSV FILE's FIRST LINE
$arr['stock'] = $data[2]; // WANT TO USE $data['stock'] FROM CSV FILE's FIRST LINE
$arr['price'] = $data[3]; // WANT TO USE $data['price'] FROM CSV FILE's FIRST LINE
$ar[] = $arr;
}
fclose($csvFile);
如何從檔案中獲取密鑰并在上面的代碼中使用它?
更新
我看到如果我將鍵存盤在陣列中并像這樣列印它
$csvFile = fopen($_FILES['file']['tmp_name'], 'r');
$getFileKeys = fgetcsv($csvFile); // STORED KEYS IN ARRAY
fgetcsv($csvFile);
print_r($getFileKeys);
然后我得到一個這樣的陣列:
Array
(
[0] => id
[1] => date
[2] => stock_name
[3] => price
)
我需要以這樣的方式撰寫邏輯,如果我為上面的每個元素都有 4 個變數,那么無論任何元素的索引是否發生變化,變數都會動態接收相同的值。
uj5u.com熱心網友回復:
由于您已經在$getFileKeys
變數中獲得了鍵,您可以簡單地使用 for 回圈遍歷鍵陣列并根據欄位動態分配索引。
$getFileKeys = fgetcsv($csvFile);
$keys = [];
for($i = 0; $i < count($getFileKeys); $i ){
if($getFileKeys[$i] == 'id'){
$keys['id'] = $i;
}else if($getFileKeys[$i] == 'date'){
$keys['date'] = $i;
}else if($getFileKeys[$i] == 'stock_name'){
$keys['stock'] = $i;
}else if($getFileKeys[$i] == 'price'){
$keys['price'] = $i;
}
}
while($getData = fgetcsv($csvFile, 100, ",")){
$arr['id'] = $getData[$keys['id']];
$arr['date'] = date('Y-m-d', strtotime($getData[$keys['date']]));
$arr['stock'] = trim($getData[$keys['stock']]);
$arr['price'] = $getData[$keys['price']];
$ar[] = $arr;
}
該$keys
陣列現在動態存盤每個鍵的索引。因此,現在無論哪一列的放置順序如何,都會對 CSV 檔案進行排序。
uj5u.com熱心網友回復:
你可以在第一行中創建變數,這樣你就可以用她的名字來稱呼它們。
$exampleLine=[
'id' => 1
'date' => '2022-07-01'
'stock_name' => 'stock_name'
'3' => 'price'
];
foreach($exampleLine as $name){
$$name=$name;
}
這將為您提供具有適當內容的變數,以便 $id 包含 1、$date '2022-07-01' 等等。
為防止出現不同的拼寫,您仍然可以使用lcfirst
and trim
。
PHP-手冊
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/497978.html