簡體   English   中英

PHP-在多維數組中搜索值並返回其ID

[英]PHP - Search for a value in Multi-Dimensional array and returns its ID

我正在通過創建服裝店來練習php。

考慮我的PHP數據庫數組:

$mens[101] = [
    "title" => "Block Original T-Shirt",
    "img" => "img/clothing/men/tShirts/block-orig-black.jpg",
    "price" => 16,
    "color" => "black",
    "altColor" => array("black" , "white", "grey"),
    "size" => array (
        array(
            "size" => "x-small",
            "qty" => 3
        ),
        array(
            "size" => "small",
            "qty" => 10
        ),
        array(
            "size" => "medium",
            "qty" => 0
        ),
        array(
            "size" => "large",
            "qty" => 15
        ),
        array(
            "size" => "x-large",
            "qty" => 9
        )
    ),
    "description" => "Duis eget volutpat mauris, quis lacinia orci. Cras mattis bibendum lorem, nec faucibus ipsum fermentum at. Nulla tincidunt ligula suscipit elit tincidunt, non vulputate nibh dapibus. Proin quis sapien hendrerit, vulputate nibh sit amet, rutrum quam.",
    "category" => "m-tShirts"
];

$mens[102] = [ ....]
$mens[103] = [ ....]
$mens[...

授予了一個新手問題,但我要遍歷數據庫以查找類別=“ m-shirts”的那些項目,一旦找到這些項目,我想從這些結果中選擇一個隨機的項目進行處理。

foreach($mens as $sug) {
    if ($sug["category"] === "m-shirts") {
        echo key($mens);
    }
}

我正在使用echo檢查是否收集了正確的ID。 但是,這回顯“ 101” 15次(“ m恤”類別的產品數量)。 但是我想要這些特定結果的唯一ID(巧合的是ID的201到215)。 我想用英語:

foreach(product in $mens array){
     if(product has the category "m-shirts"){
           collect the id's;
           select a random id and store as variable $suggestion
     }
}

如果有人可以幫助我或指向我任何文章/教程的方向。 我花了大部分時間來閱讀php文檔,並且還無法通過數組學習“學習PHP,MySQL和JavaSript(由Robin Nixon設計)”一章。

提前致謝!

不用滾動自己的過濾器,而是使用PHP的: array_filter

$mTShirts = array_filter($mens, function($item) {
        return $item['category'] == 'm-tShirts';
    });

這樣一來,您可以使用所需的任何方式訪問結果,包括foreach或通過某些面向集合的方法(例如數組函數迭代器)訪問結果 在這種情況下, array_rand可用於選擇隨機數組元素。

$idx = array_rand($mTShirts);
$item = $mens[$idx];

該手冊應該是您編寫操作之前的第一站。 特別是SPL具有許多有用的類和函數,但不要忽略整個函數引用 (不再列出確切的名稱,因為列出了許多類;“擴展接口引用”更為准確)。

但是,這引出了一個問題,即是以PHP實現數據存儲還是使用外部DB(對於標准操作已經具有安全,有效的實現)。 您撰寫的任何內容均可能導致:

  1. 效率降低,
  2. 變得笨拙,
  3. 功能較少,
  4. 花寶貴的開發時間來設計和實施

您可以像在第一個Foreach循環中那樣簡單地遍歷Shop-Items數組。 然后創建一個數組來保存屬於“ m恤衫”類別的ID產品。 在循環中,您只需將此類產品的所有ID推送到創建的數組變量中即可。 之后,您可以生成一個介於0和ID數組長度減去1之間的隨機數。 使用此隨機數,您可以選擇一個ID。

    <?php

        // CREATE AN ARRAY TO HOLD THE IDS OF PRODUCTS UNDER THE CATEGORY: m-shirts     
        $mShirtsCatIDS  = array();

        // LOOP THROUGH THE SHOP ITEMS IN SEARCH OF PRODUCTS WITH CATEGORY: m-shirts
        foreach($mens as $id=>$men){
            // IF FOUND, PUSH THE ID TO THE $mShirtsCatIDS ARRAY
            if($men['category'] == 'm-shirts'){
                // PUSH THE IDs TO THE $mShirtsCatIDS ARRAY
                $mShirtsCatIDS[]    = $id;
            }
        }

        // IF OUR ARRAY OF IDs IS NOT EMPTY; JUST GENERATE A RANDOM NUMBER
        // BETWEEN 0 AND THE LENGTH OF THE ARRAY MINUS 1.
        // USING THAT GENERATED RANDOM NUMBER, PICK OUT ONE ID...       
        if(count($mShirtsCatIDS)>0){
            // GENERATE THE RANDOM NUMBER...
            $randNum    = rand(0, (count($mShirtsCatIDS) - 1));

            // PICK OUT AN ID, USING THIS RANDOM NUMBER...
            $randID     = $mShirtsCatIDS[$randNum];
            // END OF STORY..... ;-) 
        }

        var_dump($randID); //<== DUMPS A NEW ID EACH TIME.

        // YOU CAN NOW GET THE PRODUCT CORRESPONDING TO THIS ID
        // LIKE SO: $mens[$randID].... 

此處查看模擬演示。

希望對您有幫助。

干杯和好運...

如@firstone所述,我認為您的特定問題的答案是使用:

$results = [];
foreach($mens as $key => $value) {
    if ($value["category"] === "m-shirts") {
        $results[] = $key;
    }
}

# view all results: // print_r($results);

// get random key from results:
$rand_item = array_rand($results);

echo $results[$rand_item];

如果您想要的只是一個具有類別m-shirts的隨機數組,那么我應該這樣做:

shuffle($mens);
$cats   = array_column($mens, null, 'category');
$result = $cats['m-shirts'];
  • 隨機排列數組(隨機化)
  • 獲取用category索引的數組(每個類別只有一個,因為它們必須是唯一索引)
  • 將陣列與索引m-shirts

或更短:

shuffle($mens);
$result = array_column($mens, null, 'category')['m-shirts'];

嘗試php array_search函數。 有關更多信息,請檢查以下URL: function.array-search

在foreach上方建立一個數組,以收集迭代結果。

使用提供的中間代碼塊; 但是稍微改變一下。 看起來您在一個數組中有一個數組,但是if測試中只有一個分層的迭代和檢查。 要么進行另一輪迭代以覆蓋數組鍵的下一層,要么將if測試更改為您想要的那個鍵之后。 該區域中的var_dump可幫助您更好地調試和開發該部分。

也就是說,將很難深入到用來描述迭代的最外層循環的命名的抽象層。

通過if測試后的方括號中,將“ id”值添加到保持數組中。 這樣,您可以收集所有發現的ID。 如果id在名為key的變量中,則只需將其添加為:

$holder[] = $key;

或類似。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM