Rumah  >  Soal Jawab  >  teks badan

Tatasusunan dalam PHP: hasil yang mengejutkan apabila menambah item baharu

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!

P粉893457026P粉893457026175 hari yang lalu397

membalas semua(1)saya akan balas

  • P粉739942405

    P粉7399424052024-04-01 00:29:12

    Mari kaji kod anda dahulu. Soalan yang anda nyatakan, iaitu. Baris berikut:

    $arrayKey = array_search($date, array_column($array, 'date'));

    ...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:

    if($arrayKey !== false && $array[$arrayKey]){
    ...

    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:

    $amount = intval($array[$arrayKey]['collection-size']);

    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:

    $array[$arrayKey]['collection-size'] ??= 0;

    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:

    $array[$date] ??= [
        'date' => $date,
        'caption' => '',
        'collection-size' => 0,
        'has-video' => false,
    ];

    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:

    $files = <<
    

    Anda juga boleh meletakkan glob fail ke dalam tatasusunan (= senarai laluan fail):

    $file_directory = "images/instagram";
    $files = glob(dirname(realpath(__DIR__)).'/'.$file_directory.'/*');

    Kemudian lelaran seperti berikut:

    foreach($files as $filepath) {
        $filename = basename($filepath);
        $date = strstr($filename, '_UTC', true);
        
        $array[$date] ??= [
            'date' => $date,
            'caption' => '',
            'collection-size' => 0,
            'has-video' => false,
        ];
        
        $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION));
        
        if($ext === 'jpg'){
            // Each JPG increments collection size:
            $array[$date]['collection-size']++;
        }
        
        elseif ($ext === "txt"){
            // We use a dummy here:
            $caption = '---';
            // $caption = file_get_contents($filepath);
    
            $array[$date]['caption'] = $caption;
        }
    }

    Perhatikan betapa ia mengecut. apa yang berlaku

    • Kami menggunakan $date 作为数组的分组索引。不再有 array_search!
    • Kami memulakan entri lalai untuk setiap tarikh. Tiada pemeriksaan atau syarat lanjut diperlukan!
    • Kami mengabaikan _3 dalam nama fail dan seterusnya untuk "saiz koleksi": cuma tambah +1 pada setiap JPG.
    • Kami menggunakan nglobfile_get_contents 而不是 readdirfopen.
    • Susunan fail tidak penting. (Jangan ragu untuk menguji dan shuffle($files)!)

    Hasil:

    array(3) {
        ["2022-12-26_14-14-01"] · array(4) {
            ["date"] · string(19) "2022-12-26_14-14-01"
            ["caption"] · string(3) "---"
            ["collection-size"] · int(3)
            ["has-video"] · bool(false)
        }
        ["2022-12-27_14-14-01"] · array(4) {
            ["date"] · string(19) "2022-12-27_14-14-01"
            ["caption"] · string(3) "---"
            ["collection-size"] · int(2)
            ["has-video"] · bool(false)
        }
        ["2022-12-31_18-13-43"] · array(4) {
            ["date"] · string(19) "2022-12-31_18-13-43"
            ["caption"] · string(3) "---"
            ["collection-size"] · int(1)
            ["has-video"] · bool(false)
        }
    }

    balas
    0
  • Batalbalas