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

PHP 中的新數組函數

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

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]刪除
最新教學 更多>
  • 如何使用Python的請求和假用戶代理繞過網站塊?
    如何使用Python的請求和假用戶代理繞過網站塊?
    如何使用Python的請求模擬瀏覽器行為,以及偽造的用戶代理提供了一個用戶 - 代理標頭一個有效方法是提供有效的用戶式header,以提供有效的用戶 - 設置,該標題可以通過browser和Acterner Systems the equestersystermery和操作系統。通過模仿像Chro...
    程式設計 發佈於2025-06-09
  • Spark DataFrame添加常量列的妙招
    Spark DataFrame添加常量列的妙招
    在Spark Dataframe ,將常數列添加到Spark DataFrame,該列具有適用於所有行的任意值的Spark DataFrame,可以通過多種方式實現。使用文字值(SPARK 1.3)在嘗試提供直接值時,用於此問題時,旨在為此目的的column方法可能會導致錯誤。 df.withCo...
    程式設計 發佈於2025-06-09
  • 如何正確使用與PDO參數的查詢一樣?
    如何正確使用與PDO參數的查詢一樣?
    在pdo 中使用類似QUERIES在PDO中的Queries時,您可能會遇到類似疑問中描述的問題:此查詢也可能不會返回結果,即使$ var1和$ var2包含有效的搜索詞。錯誤在於不正確包含%符號。 通過將變量包含在$ params數組中的%符號中,您確保將%字符正確替換到查詢中。沒有此修改,PD...
    程式設計 發佈於2025-06-09
  • 為什麼我的CSS背景圖像出現?
    為什麼我的CSS背景圖像出現?
    故障排除:CSS背景圖像未出現 ,您的背景圖像儘管遵循教程說明,但您的背景圖像仍未加載。圖像和样式表位於相同的目錄中,但背景仍然是空白的白色帆布。 而不是不棄用的,您已經使用了CSS樣式: bockent {背景:封閉圖像文件名:背景圖:url(nickcage.jpg); 如果您的html,cs...
    程式設計 發佈於2025-06-09
  • 如何在Java字符串中有效替換多個子字符串?
    如何在Java字符串中有效替換多個子字符串?
    在java 中有效地替換多個substring,需要在需要替換一個字符串中的多個substring的情況下,很容易求助於重複應用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    程式設計 發佈於2025-06-09
  • 如何實時捕獲和流媒體以進行聊天機器人命令執行?
    如何實時捕獲和流媒體以進行聊天機器人命令執行?
    在開發能夠執行命令的chatbots的領域中,實時從命令執行實時捕獲Stdout,一個常見的需求是能夠檢索和顯示標準輸出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    程式設計 發佈於2025-06-09
  • 如何在無序集合中為元組實現通用哈希功能?
    如何在無序集合中為元組實現通用哈希功能?
    在未訂購的集合中的元素要糾正此問題,一種方法是手動為特定元組類型定義哈希函數,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    程式設計 發佈於2025-06-09
  • 如何高效地在一個事務中插入數據到多個MySQL表?
    如何高效地在一個事務中插入數據到多個MySQL表?
    mySQL插入到多個表中,該數據可能會產生意外的結果。雖然似乎有多個查詢可以解決問題,但將從用戶表的自動信息ID與配置文件表的手動用戶ID相關聯提出了挑戰。 使用Transactions和last_insert_id() 插入用戶(用戶名,密碼)值('test','tes...
    程式設計 發佈於2025-06-09
  • 如何從PHP中的Unicode字符串中有效地產生對URL友好的sl。
    如何從PHP中的Unicode字符串中有效地產生對URL友好的sl。
    為有效的slug生成首先,該函數用指定的分隔符替換所有非字母或數字字符。此步驟可確保slug遵守URL慣例。隨後,它採用ICONV函數將文本簡化為us-ascii兼容格式,從而允許更廣泛的字符集合兼容性。 接下來,該函數使用正則表達式刪除了不需要的字符,例如特殊字符和空格。此步驟可確保slug僅包...
    程式設計 發佈於2025-06-09
  • 找到最大計數時,如何解決mySQL中的“組函數\”錯誤的“無效使用”?
    找到最大計數時,如何解決mySQL中的“組函數\”錯誤的“無效使用”?
    如何在mySQL中使用mySql 檢索最大計數,您可能會遇到一個問題,您可能會在嘗試使用以下命令:理解錯誤正確找到由名稱列分組的值的最大計數,請使用以下修改後的查詢: 計數(*)為c 來自EMP1 按名稱組 c desc訂購 限制1 查詢說明 select語句提取名稱列和每個名稱...
    程式設計 發佈於2025-06-09
  • 為什麼我在Silverlight Linq查詢中獲得“無法找到查詢模式的實現”錯誤?
    為什麼我在Silverlight Linq查詢中獲得“無法找到查詢模式的實現”錯誤?
    查詢模式實現缺失:解決“無法找到”錯誤在Silverlight應用程序中,嘗試使用LINQ建立LINQ連接以錯誤而實現的數據庫”,無法找到查詢模式的實現。”當省略LINQ名稱空間或查詢類型缺少IEnumerable 實現時,通常會發生此錯誤。 解決問題來驗證該類型的質量是至關重要的。在此特定實例...
    程式設計 發佈於2025-06-09
  • PHP SimpleXML解析帶命名空間冒號的XML方法
    PHP SimpleXML解析帶命名空間冒號的XML方法
    在php 很少,請使用該限制很大,很少有很高。例如:這種技術可確保可以通過遍歷XML樹和使用兒童()方法()方法的XML樹和切換名稱空間來訪問名稱空間內的元素。
    程式設計 發佈於2025-06-09
  • 如何簡化PHP中的JSON解析以獲取多維陣列?
    如何簡化PHP中的JSON解析以獲取多維陣列?
    php 試圖在PHP中解析JSON數據的JSON可能具有挑戰性,尤其是在處理多維數組時。 To simplify the process, it's recommended to parse the JSON as an array rather than an object.To do...
    程式設計 發佈於2025-06-09
  • Java字符串非空且非null的有效檢查方法
    Java字符串非空且非null的有效檢查方法
    檢查字符串是否不是null而不是空的 if(str!= null && str.isementy())二手: if(str!= null && str.length()== 0) option 3:trim()。 isement(Isement() trim whitespace whites...
    程式設計 發佈於2025-06-09
  • 如何使用替換指令在GO MOD中解析模塊路徑差異?
    如何使用替換指令在GO MOD中解析模塊路徑差異?
    在使用GO MOD時,在GO MOD 中克服模塊路徑差異時,可能會遇到衝突,其中3個Party Package將另一個PAXPANCE帶有導入式套件之間的另一個軟件包,並在導入式套件之間導入另一個軟件包。如迴聲消息所證明的那樣: go.etcd.io/bbolt [&&&&&&&&&&&&&&&&...
    程式設計 發佈於2025-06-09

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

Copyright© 2022 湘ICP备2022001581号-3