Jadi saya sedang menulis kod yang membolehkan saya mengumpul imej yang dikumpul oleh perpustakaan ular sawa Instaloader dan meletakkannya ke dalam galeri di tapak web saya. Saya telah berjaya mengumpul dan memaparkan ini tanpa sebarang masalah, namun saya kini telah mula melaksanakan pengepala untuk setiap siaran dan saya menghadapi masalah.
Cara perpustakaan memuat turun foto ialah jika terdapat lebih daripada satu foto dalam koleksi, ia akan menambah _1, _2, dsb. akhiran pada siaran berdasarkan kedudukan imej dalam koleksi dan menyediakan fail .txt sebagai satu tajuk.
Contoh kandungan folder untuk koleksi:
2022-12-26_14-14-01_UTC.txt 2022-12-26_14-14-01_UTC_1.jpg 2022-12-26_14-14-01_UTC_2.jpg 2022-12-26_14-14-01_UTC_3.jpg
Siaran siaran tunggal berfungsi dengan baik Contoh:
2022-12-31_18-13-43_UTC.txt 2022-12-31_18-13-43_UTC.jpg
Blok kod utama:
$array = []; $account_name = "everton"; $file_directory = "images/instagram"; $count = 0; $hasvideo = 0; $hasCaption = 0; $handle = opendir(dirname(realpath(__DIR__)).'/'.$file_directory.'/'); while($file = readdir($handle)){ $date = substr($file, 0, strpos($file, "_UTC")); $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION)); // Using strtolower to overcome case sensitive if($ext === 'jpg'){ $count++; $collectionSize = (int)str_replace("_", "", str_replace(".jpg", "", explode("UTC",$file)[1])); if(!is_numeric($collectionSize)){ $collectionSize = 0; } $arrayKey = array_search($date, array_column($array, 'date')); if($arrayKey){ $amount = intval($array[$arrayKey]['collection-size']); if($collectionSize > $amount){ $array[$arrayKey]['collection-size'] = (int)$collectionSize; } }else{ array_push($array, array ("date" => $date, "collection-size" => (int)$collectionSize, "has-video" => false)); } } if ($ext === "txt"){ $file_location = dirname(realpath(__DIR__)).'/'.$file_directory.'/'. $file; $myfile = fopen( $file_location, "r") or die("Unable to open file!"); $caption = fread( $myfile, filesize($file_location)); $arrayKey = array_search($date, array_column($array, 'date')); //$arrayKey returns false when there is a collection. if($array[$arrayKey]){ $array[$arrayKey]['caption'] = $caption; }else{ array_push($array, array ("date" => $date, "caption" => $caption)); } fclose($myfile); } }
$arrayKey mengembalikan palsu apabila koleksi wujud pada siaran tunggal biasa.
Saya percaya ini ada kaitan dengan susunan fail di mana skrip membaca fail ini, kerana saya mengandaikan ia berbunyi (tarikh).txt sebelum membaca (tarikh)_(collectionposition).jpg
Jika entri tatasusunan telah pun dibuat, pengepala biasanya ditambahkan pada data tatasusunan, jika tidak (cth. apabila _1, _2, dsb. hadir), tatasusunan tidak mengemas kini apa-apa dan tiada ralat dilemparkan.
Sunting: Penyelesaian masalah lanjut menunjukkan bahawa cara saya mengemas kini/menyemak kekunci tatasusunan berdasarkan nilai "tarikh" adalah salah, semoga cara yang betul untuk mengendalikan operasi ini boleh ditemui
Sebarang panduan tentang perkara yang boleh saya perbaiki untuk membuat kerja ini seperti yang diharapkan akan dihargai, terima kasih!
Mari kaji kod anda dahulu. Soalan yang anda nyatakan, iaitu. Baris berikut:
...Return
false
,因为处理.txt
文件时尚未创建带有日期的$array
条目。 (使用array_push
Logik untuk mencipta ahli tatasusunan adalah di bawah kod. )Pembetulan mudah untuk terus bergerak ke bahagian
if/else
logik yang berkaitan belum ditakrifkan:Iaitu, jika
$arrayKey
不是false
, maka teruskan menambah nilai kepada ahli tatasusunan sedia ada. Jika tidak, buat ahli tatasusunan.Selain itu, terdapat isu semasa memproses imej, yang menghasilkan amaran pada kali pertama ia berlaku:
Ini akan gagal dengan kunci tatasusunan tidak ditentukan 'saiz koleksi' kerana kunci
collection-size
belum wujud lagi. Betulkan cth. menggunakan operator penggabungan nol untuk menetapkan "sifar lalai" sebelum cuba mengendalikan kekunci tatasusunan:Komen ini membetulkan pepijat, tetapi adalah lebih baik untuk memisahkan "penciptaan entri" dalam contoh pertama txt atau jpg - gunakan ahli tatasusunan kosong dengan kunci yang diharapkan, sebelum melakukan sebarang logik khusus txt/jpg. Saya hanya akan menggunakan
$date
本身作为分组,这样您也可以摆脱array_search
. Sebagai contoh, selepas mengekstrak tarikh, gunakan:Kemudian ubah suai kod yang lain untuk dipadankan. Kod anda tidak seharusnya bergantung pada susunan fail dibaca. Tempahan tidak dijamin. Jika tidak, anda sentiasa boleh membaca senarai fail ke dalam tatasusunan biasa terlebih dahulu, kemudian mengisihnya, dan lelaran semula apabila menggunakan logik tertentu.
Kod ringkas
Jumlah kod sebenar yang diperlukan adalah lebih sedikit daripada yang anda miliki. Di sini saya telah memotongnya untuk anda. Saya tidak mempunyai fail anda, jadi berikut ialah beberapa data palsu:
$date
作为数组的分组索引。不再有array_search
!_3
dalam nama fail dan seterusnya untuk "saiz koleksi": cuma tambah +1 pada setiap JPG.nglob
和file_get_contents
而不是readdir
和fopen
.shuffle($files)
!)Hasil: