ホームページ  >  に質問  >  本文

PHP の配列: 新しい項目を追加したときの驚くべき結果

そこで、Instaloader Python ライブラリによって収集された画像を収集し、Web サイト上のギャラリーに配置できるコードを作成しています。これらを問題なく収集して表示することができましたが、各投稿のヘッダーを実装し始めたところ、問題が発生しました。

ライブラリが写真をダウンロードする方法は、コレクション内に複数の写真がある場合、コレクション内の画像の位置に基づいて投稿に _1、_2 などのサフィックスを追加し、.txt を提供することです。ファイルをタイトルとして使用します。

コレクション用のサンプル フォルダーの内容:

リーリー

単一投稿の投稿はうまく機能します 例: ### リーリー

メインコードブロック:

リーリー

$arrayKey は、通常の単一投稿にコレクションが存在する場合に false を返します。

これは、スクリプトが (date).txt を読み取る前に (date)_(collectionposition).jpg を読み取ると仮定しているため、スクリプトがこれらのファイルを読み取るファイル順序に関係していると思います。

配列エントリがすでに作成されている場合は、通常、ヘッダーが配列データに追加されます。そうでない場合 (_1、_2 などが存在する場合など)、配列は何も更新されず、エラーも発生しません。

###編集: さらにトラブルシューティングを行うと、「日付」値に基づいて配列キーを更新/チェックする方法が間違っていることがわかります。これらの操作を処理する正しい方法が見つかることを願っています

これを期待どおりに機能させるために修正できる点についてアドバイスをいただければ幸いです。ありがとうございます。

P粉893457026P粉893457026175日前395

全員に返信(1)返信します

  • P粉739942405

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

    まずコードを勉強しましょう。 あなたが指摘した問題は次のとおりです。次の行:

    リーリー

    ....txt ファイルの処理中に日付を含む $array エントリが作成されていないため、false を返します。 (array_push を使用して配列メンバーを作成するロジックはコードの下にあります。)

    if/else

    ロジックの関連部分に移動し続けるための簡単な修正 まだ定義されていません : リーリー つまり、

    $arrayKey

    false でない場合は、既存の配列メンバーへの値の追加を続けます。それ以外の場合は、配列メンバーを作成します。 さらに、画像の処理中に問題が発生し、初めて発生したときに警告が生成されます:

    リーリー

    collection-size

    キーがまだ存在しないため、これは 未定義の配列キー 'collection-size' で失敗します。たとえば、配列キーを操作する前に null 合体演算子を使用して「デフォルトのゼロ」を設定するなどの修正: リーリー これらのコメントはバグを修正しますが、txt/jpg 固有のロジックを実行する前に、txt または jpg の最初のインスタンスで、予期されるキーを持つ空の配列メンバーを使用して「エントリの作成」を分離した方がよいでしょう。

    $date

    自体をグループ化として使用するだけなので、array_search も削除できます。たとえば、日付を抽出した後、次を使用します: リーリー 次に、コードの残りの部分を変更して一致させます。

    コードは、ファイルが読み取られる順序に依存しないでください。

    順序は保証されません。それ以外の場合は、いつでも最初にファイルのリストを通常の配列に読み取り、次にそれらを並べ替えて、特定のロジックを適用するときに再度繰り返すことができます。 簡略化されたコード

    実際に必要なコードの量は、実際に必要なコードの量よりもはるかに少なくなります。ここでトリミングしてみました。ファイルがないので、ここにダミー データをいくつか示します:

    リーリー

    glob

    ファイルを配列 (= ファイル パスのリスト) に入れることもできます。 リーリー 次に、次のように繰り返します:

    リーリー

    どれだけ縮むかに注目してください。どうしたの?

      $date
    • を配列のグループ化インデックスとして使用します。 array_search はもう必要ありません。 各日付のデフォルトのエントリを初期化します。それ以上の検査や条件は必要ありません。
    • ファイル名に含まれる
    • _3
    • などの「コレクション サイズ」は無視されます。JPG ごとに 1 を追加するだけです。 ここでは、
    • readdir
    • fopen の代わりに、nglobfile_get_contents を使用します。 ファイルの順序は重要ではありません。 (自由にテストして
    • shuffle($files)
    • !) ###結果:### リーリー

      返事
      0
  • キャンセル返事