」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > PHP 中的新數組函數

PHP 中的新數組函數

發佈於2024-08-21
瀏覽:498

New Array Functions in PHP

介绍

PHP 8.4 将于 2024 年 11 月发布,并将引入一些方便的新数组函数:

  • 数组查找
  • 数组查找键
  • array_any
  • 数组全部

在本文中,我们将快速浏览这些新函数以及如何在运行 PHP 8.4 的项目中使用它们。

如果您是 Laravel 开发人员,您可能会注意到我们在 Illuminate\Support\Collection 和 Illuminate\Support\Arr 类中已经有了类似的函数。但我喜欢这些函数是 PHP 原生的,因此可以在任何 PHP 项目中使用。

对于任何作为 Laravel 开发人员的读者,我将向您展示这些新功能的 Laravel 等效项,以便您可以在 Laravel 项目中实现相同的功能,而无需等待 PHP 8.4。

您可能还有兴趣查看我的另一篇文章,其中讨论了 PHP 8.4 的新“属性挂钩”功能。

array_find 函数

array_find 函数返回与回调中定义的条件匹配的第一个元素的值。如果没有元素与回调匹配,则函数返回 null。

让我们看一个简单的例子。我们假设我们有一系列产品,并且我们想要找到条形码为 123456 的产品:

$products = [
    [
        'name' => 'Macbook Pro',
        'type' => 'Laptop',
        'barcode' => 123456,
    ],
    [
        'name' => 'Framework Laptop 13',
        'type' => 'Laptop',
        'barcode' => 789012,
    ],
    [
        'name' => 'Samsung Galaxy S24',
        'type' => 'Phone',
        'barcode' => 135791,
    ],
];

// Find the product with barcode 123456
$findProduct = array_find(
    array: $products,
    callback: function (array $product): bool {
        return $product['barcode'] == 123456;
    },
);

运行上面的代码后,$findProduct将等于:

[
    'name'=> 'Macbook Pro',
    'type' => 'Laptop',
    'barcode' => 123456,
]

我们可以通过使用箭头函数作为第二个参数来进一步清理它:

$findProduct = array_find(
    array: $products,
    callback: fn (array $product): bool => $product['barcode'] === 123456,
);

上面的代码将返回与前面的示例相同的结果。

如果没有元素与回调匹配,函数将返回 null。让我们看一个例子:

$nonExistentProduct = array_find(
    array: $products,
    callback: fn (array $product): bool => $product['barcode'] === 'invalid',
);

在这种情况下,$nonExistentProduct 将等于 null。

Laravel 等效项

在 Laravel 中,您可以使用 Arr::first 方法获得类似的结果:

use Illuminate\Support\Arr;

$findProduct = Arr::first(
    $products,
    fn (array $product): bool => $product['barcode'] === 123456,
);

array_find_key 函数

该函数与array_find函数类似,但它不是返回与回调匹配的第一个元素的值,而是返回与回调匹配的第一个元素的键。

让我们以之前的 $products 示例数组为例。这次,我们要查找条形码为 789012 的产品的密钥:

$products = [
    [
        'name' => 'Macbook Pro',
        'type' => 'Laptop',
        'barcode' => 123456,
    ],
    [
        'name' => 'Framework Laptop 13',
        'type' => 'Laptop',
        'barcode' => 789012,
    ],
    [
        'name' => 'Samsung Galaxy S24',
        'type' => 'Phone',
        'barcode' => 135791,
    ],
];

// Find the key of the product with barcode 789012
$findProduct = array_find_key(
    array: $products,
    callback: fn (array $product): bool => $product['barcode'] === 789012,
);

运行上面的代码后,$findProduct 将等于 1,因为产品是数组中的第二个元素。

如果没有元素与回调匹配,函数将返回 null。让我们看一个例子:

$nonExistentProduct = array_find_key(
    array: $products,
    callback: fn (array $product): bool => $product['barcode'] === 'invalid',
);

在这种情况下,$nonExistentProduct 将等于 null。

Laravel 等效项

在 Laravel 中,您可以使用 array_keys 和 Arr::first 方法的组合来实现类似的结果:

use Illuminate\Support\Arr;

$firstProductKey = Arr::first(
    array_keys($products),
    fn (int $key): bool => $products[$key]['barcode'] === 789012,
);

在上面的代码中,我们首先使用 array_keys 来获取 $products 数组的键数组。然后我们使用 Arr::first 来查找与回调匹配的第一个键。这比原生 PHP 函数稍微冗长一些,但它达到了相同的结果。

array_any 函数

array_any 函数允许您检查数组中至少一个元素是否符合回调中定义的条件。如果任何元素与回调匹配,则该函数返回 true。如果没有元素与回调匹配,则函数返回 false。

继续使用我们的 $products 示例数组,让我们检查是否有任何产品具有笔记本电脑类型:

$anyProductsAreLaptops = array_any(
    array: $products,
    callback: fn (array $product): bool => $product['type'] === 'Laptop',
);

在这种情况下,$anyProductsAreLaptops 将等于 true,因为数组中至少有一个产品是笔记本电脑。

如果没有元素与回调匹配,函数将返回 false。让我们看一个例子:

$anyProductsAreInvalid = array_any(
    array: $products,
    callback: fn (array $product): bool => $product['type'] === 'Invalid',
);

在这种情况下,$anyProductsAreInvalid 将等于 false。

Laravel 等效项

我们可以在 Laravel 中使用集合上的 contains 方法达到相同的结果:

use Illuminate\Support\Collection;

$anyProductsAreLaptops = Collection::make($products)->contains(
    fn (array $product): bool => $product['type'] === 'Laptop',
);

在上面的代码中,我们从 $products 数组创建一个集合,然后使用 contains 方法检查集合中是否有任何产品是笔记本电脑。

array_all 函数

array_all 函数与 array_any 函数类似,但它不是检查是否至少有一个元素与回调匹配,而是检查所有元素是否与回调匹配。如果所有元素都与回调匹配,则该函数返回 true。如果任何元素与回调不匹配,则函数返回 false。

让我们检查一下 $products 数组中的所有产品是否都是笔记本电脑:

$allProductsAreLaptops = array_all(
    array: $products,
    callback: fn (array $product): bool => $product['type'] === 'Laptop',
);

在这种情况下,$allProductsAreLaptops 将等于 false,因为并非数组中的所有产品都是笔记本电脑。

Laravel 等效项

在 Laravel 中,我们可以使用集合上的 every 方法达到相同的结果:

use Illuminate\Support\Collection;

$allProductsAreLaptops = Collection::make($products)->every(
    fn (array $product): bool => $product['type'] === 'Laptop',
);

在上面的代码中,我们从 $products 数组创建一个集合,然后使用 every 方法检查集合中的所有产品是否都是笔记本电脑。

结论

希望本文向您展示了如何使用 PHP 8.4 中提供的新数组函数。它还应该让您了解如何使用 Illuminate\Support\Collection 和 Illuminate\Support\Arr 类在 Laravel 中实现类似的功能。

如果您喜欢阅读这篇文章,您可能有兴趣查看我的 220 页电子书“Battle Ready Laravel”,其中更深入地涵盖了类似的主题。

或者,您可能想查看我的另一本 440 页电子书“Consuming APIs in Laravel”,它教您如何使用 Laravel 来使用来自其他服务的 API。

如果您有兴趣在我每次发布新帖子时获得更新,请随时订阅我的时事通讯。

继续打造精彩的东西! ?

版本聲明 本文轉載於:https://dev.to/ashallendesign/new-array-functions-in-php-84-nbl?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • Polyfills-填充物還是縫隙? (第 1 部分)
    Polyfills-填充物還是縫隙? (第 1 部分)
    幾天前,我們在組織的 Teams 聊天中收到一條優先訊息,內容如下:發現安全漏洞 - 偵測到 Polyfill JavaScript - HIGH。 舉個例子,我在一家大型銀行公司工作,你必須知道,銀行和安全漏洞就像主要的敵人。因此,我們開始深入研究這個問題,並在幾個小時內解決了這個問題,我將在下...
    程式設計 發佈於2024-11-05
  • 移位運算子與位元簡寫賦值
    移位運算子與位元簡寫賦值
    1。移位運算子 :向右移動。 >>>:無符號右移(零填充)。 2.移位運算子的一般語法 value > num-bits:將值位向右移動,保留符號位。 value >>> num-bits:透過在左側插入零將值位向右移動。 3.左移 每次左移都會導致該值的所有位元向左移動一位。 右側插入0...
    程式設計 發佈於2024-11-05
  • 如何使用 VBA 從 Excel 建立與 MySQL 資料庫的連線?
    如何使用 VBA 從 Excel 建立與 MySQL 資料庫的連線?
    VBA如何在Excel中連接到MySQL資料庫? 使用VBA連接到MySQL資料庫嘗試連接使用 VBA 在 Excel 中存取 MySQL 資料庫有時可能具有挑戰性。在您的情況下,您在嘗試建立連線時遇到錯誤。 若要使用 VBA 成功連線至 MySQL 資料庫,請依照下列步驟操作:Sub Connec...
    程式設計 發佈於2024-11-05
  • 測試自動化:使用 Java 和 TestNG 進行 Selenium 指南
    測試自動化:使用 Java 和 TestNG 進行 Selenium 指南
    测试自动化已成为软件开发过程中不可或缺的一部分,使团队能够提高效率、减少手动错误并以更快的速度交付高质量的产品。 Selenium 是一个用于自动化 Web 浏览器的强大工具,与 Java 的多功能性相结合,为构建可靠且可扩展的自动化测试套件提供了一个强大的框架。使用 Selenium Java 进...
    程式設計 發佈於2024-11-05
  • 我對 DuckDuckGo 登陸頁面的看法
    我對 DuckDuckGo 登陸頁面的看法
    「為什麼不穀歌一下呢?」是我在對話中得到的常見答案。谷歌的無所不在甚至催生了新的動詞「Google」。但是我寫的程式碼越多,我就越質疑我每天使用的數位工具。也許我對谷歌使用我的個人資訊的方式不再感到滿意。或者我們很多人依賴谷歌進行互聯網搜索和其他應用程序,說實話,我厭倦了在搜索某個主題或產品後彈出的...
    程式設計 發佈於2024-11-05
  • 為什麼 Turbo C++ 的「cin」只讀取第一個字?
    為什麼 Turbo C++ 的「cin」只讀取第一個字?
    Turbo C 的「cin」限制:僅讀取第一個單字在Turbo C 中,「cin」輸入運算符有一個處理字元數組時的限制。具體來說,它只會讀取直到遇到空白字元(例如空格或換行符)。嘗試讀取多字輸入時,這可能會導致意外行為。 請考慮以下 Turbo C 代碼:#include <iostream....
    程式設計 發佈於2024-11-05
  • 使用 Buildpack 建立 Spring Boot 應用程式的 Docker 映像
    使用 Buildpack 建立 Spring Boot 應用程式的 Docker 映像
    介绍 您已经创建了一个 Spring Boot 应用程序。它在您的本地计算机上运行良好,现在您需要将该应用程序部署到其他地方。在某些平台上,您可以直接提交jar文件,它将被部署。在某些地方,您可以启动虚拟机,下载源代码,构建并运行它。但是,大多数时候您需要使用容器来部署应用程序。大...
    程式設計 發佈於2024-11-05
  • 如何保護 PHP 程式碼免於未經授權的存取?
    如何保護 PHP 程式碼免於未經授權的存取?
    保護PHP 代碼免於未經授權的訪問保護PHP 軟體背後的智慧財產權對於防止其濫用或盜竊至關重要。為了解決這個問題,可以使用多種方法來混淆和防止未經授權的存取您的程式碼。 一個有效的方法是利用 PHP 加速器。這些工具透過快取頻繁執行的部分來增強程式碼的效能。第二個好處是,它們使反編譯和逆向工程程式碼...
    程式設計 發佈於2024-11-05
  • React:了解 React 的事件系統
    React:了解 React 的事件系統
    Overview of React's Event System What is a Synthetic Event? Synthetic events are an event-handling mechanism designed by React to ach...
    程式設計 發佈於2024-11-05
  • 為什麼在使用 Multipart/Form-Data POST 請求時會收到 301 Moved Permanently 錯誤?
    為什麼在使用 Multipart/Form-Data POST 請求時會收到 301 Moved Permanently 錯誤?
    Multipart/Form-Data POSTsMultipart/Form-Data POSTs嘗試使用multipart/form-data POST 資料時,可能會出現類似所提供的錯誤訊息遭遇。理解問題需要檢視問題的構成。遇到的錯誤是 301 Moved Permanently 回應,表示資...
    程式設計 發佈於2024-11-05
  • 如何使用日期和時間物件來確定 PHP 中的時間邊界?
    如何使用日期和時間物件來確定 PHP 中的時間邊界?
    確定PHP 中的時間邊界在此編程場景中,我們的任務是確定給定時間是否在預先定義的範圍內。具體來說,我們得到三個時間字串:當前時間、日出和日落。我們的目標是確定當前時間是否位於日出和日落的邊界時間之間。 為了應對這個挑戰,我們將使用 DateTime 類別。這個類別使我們能夠表示和操作日期和時間。我們...
    程式設計 發佈於2024-11-05
  • 如何使用 CSS 變換比例修復 jQuery 拖曳/調整大小問題?
    如何使用 CSS 變換比例修復 jQuery 拖曳/調整大小問題?
    jQuery 使用CSS 轉換縮放拖曳/調整大小問題: 當應用CSS 轉換時,特別是變換:矩陣(0.5, 0, 0, 0.5, 0, 0);,對於一個div 並在子元素上使用jQuery 的draggable() 和resizing() 插件,jQuery 所做的更改變得與滑鼠位置「不同步”。 解決...
    程式設計 發佈於2024-11-05
  • 如何修復 TensorFlow 中的「ValueError:無法將 NumPy 陣列轉換為張量(不支援的物件類型浮點)」錯誤?
    如何修復 TensorFlow 中的「ValueError:無法將 NumPy 陣列轉換為張量(不支援的物件類型浮點)」錯誤?
    TensorFlow:解決「ValueError: Failed to Convert NumPy Array to Tensor (Unsupported Object Type Float)」工作時遇到的常見錯誤TensorFlow 的錯誤是「ValueError:無法將NumPy 陣列轉換為T...
    程式設計 發佈於2024-11-05
  • 如何有效率判斷本機儲存項目是否存在?
    如何有效率判斷本機儲存項目是否存在?
    確定本地儲存專案是否存在使用 Web 儲存時,在存取或修改特定專案之前驗證它們是否存在至關重要。在本例中,我們想要確定 localStorage 中是否設定了特定項目。 當前方法檢查項目是否存在的當前方法似乎是:if (!(localStorage.getItem("infiniteScr...
    程式設計 發佈於2024-11-05
  • Java 中的原子是什麼?了解 Java 中的原子性和線程安全
    Java 中的原子是什麼?了解 Java 中的原子性和線程安全
    1. Java 原子簡介 1.1 Java 中什麼是原子? 在Java中,java.util.concurrent.atomic套件提供了一組支援對單一變數進行無鎖定線程安全程式設計的類別。這些類別統稱為原子變數。最常使用的原子類別包括 AtomicInteger ...
    程式設計 發佈於2024-11-05

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3