Power Automate/Logic Appsでループが発生するときによく出てくる items('Apply_to_each') について新しい発見があったのでまとめます。
動的コンテンツで挿入するときには「現在のアイテム」として挿入されるものです。関数で書くとこれが items('ループ名') になります。
items()についての詳細はDocsに。
式関数のリァレンス ガイド - Azure Logic Apps | Microsoft Docs

一方で、配列に対するアクションでよく使う item() ですが、式関数ガイドによると
配列に対する繰り返しアクションの内部で使うと、アクションの現在の繰り返しの間に配列の現在の項目を返します。 その項目のプロパティから値を取得することもできます。
とあります。よく使うのはSelect, Filter, Create HTML tableあたりでしょうか。

この2つの関数、似ているようで使いどころが違うようで、かなり混乱のもとなんですよね。今回はその2つの違いを調べてみました。
結論から言うと 全部 item() でいいじゃん! です。
item() は Apply to each でも使える
まずはこの事実が新たな発見でした。
item() は Apply to each の中でも使えるのです。 その際にはDocsに書いてある通り、ループの現在の項目を表します。

Apply to eachを2重にしてみると、そのスコープがもう少し明らかになる気がします。
Apply to each (親) のなかに Apply to each (子) を入れると、子のループのitem()では子ループの配列を参照しています。

ここで items('Apply_to_each') がなぜループ名を指定するのかが分かります。
子ループの中で親ループの「現在のアイテム」を参照したい場合、item()では参照できないんです。なので、items('Apply_to_each')で親ループの名前を指定して「現在のアイテム」を参照するんです。
単一のループ処理でも、もちろんループ名を指定すれば現在のアイテムを指定できます。

親ループでitem()を「作成」すればいい
これは John Liuに教えてもらいました。 全部item()だけでいけます。
イメージは下図のとおり。 子ループの中で親ループのアイテムを見たいときには、子ループの前に「作成」(Compose)アクションで親ループの「現在のアイテム」を作っておきます。

こうすると、子ループの中ではoutputs('作成')で親ループのアイテムが見えます。
この方法のいいところは、ループの実行結果で今どのループアイテムを参照しているのかが一目瞭然になるということです。

ということで、items('Apply_to_each')はあまり使わなくていいかもしれません。 (覚えることが一つ減った!)