2016-07-17 200 views
0

我正在通過創建一家服裝店來練習php。PHP - 搜索多維數組中的值並返回其ID

考慮我的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恤」這些項目,一旦我發現這些我會喜歡從這些結果中挑選一個隨機項目來處理。

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

我使用的回聲,以檢查是否正在收集正確的ID。然而,這回聲「101」15倍(產品的數量類別「米衫」)。但我想要這些特定結果的唯一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編寫)關於數組的章節,但無法解決這個問題。

謝謝提前!

+0

哪裏這些ID是? –

+1

當使用[的foreach(http://php.net/manual/en/control-structures.foreach.php),可以指定一個變量來保存當前'key',像這樣:'的foreach($陣列$ key => $ value)' – FirstOne

+0

你發佈的數組的ID在哪裏?這些ID是陣列的關鍵?那是;是陣列$男士[** 101 **]的ID = ** 101 **?因爲整個陣列中沒有ID Key。 – Poiz

回答

0

您可以簡單地循環購物項目數組,就像您在第一個Foreach循環中一樣。然後創建一個數組來保存屬於「m-shirt」類別的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].... 

退房模擬演示HERE

希望你在這裏找到有用的東西。

乾杯&好運....

+0

這是我預期用途的完美解決方案,我真的很感謝評論 - 這些幫助我很好地理解了每一行代碼。 謝謝你在我的問題上花費你的時間! –

0

正如@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]; 
+0

@Idg完美...但是,您錯過的唯一一件事是他想從「m-shirts」類別下的所有產品中選擇隨機ID的部分。否則,你就像直截了當一樣簡單...... ;-) – Poiz

+0

答覆更新。 :) – ldg

+0

@Idg當主人進入課堂時,最聰明的學生知道要做一件事:保持沉默...不是因爲他不知道該說些什麼,而是因爲他知道主人會(遲早)說出來所有......現在,在這裏:有必要說不再...... ;-) – Poiz

-1

建立在foreach以上的陣列收集的結果的迭代。

使用提供的中間代碼塊;但改變一點。它看起來像是在數組中有一個數組,但在if測試中只有單層迭代和檢查。要麼進行另一輪迭代以覆蓋下一層數組鍵,要麼更改if測試以追蹤特定的一個鍵。該區域的var_dump可以幫助您更好地調試和開發該部分。

也就是說,將很難達到上面用於描述迭代最外層循環的名稱的抽象層。

在通過if測試後的括號中,將「id」值添加到控制數組中。通過這種方式,您可以收集所有發現的ID。如果id是在一個叫做key的變量中,那麼只需加上:

$holder[] = $key; 

或類似的。

0

如果你想要的是具有m-shirts類別隨機數組,那麼我會做:

shuffle($mens); 
$cats = array_column($mens, null, 'category'); 
$result = $cats['m-shirts']; 
  • 洗牌陣列(隨機)
  • GET數組索引與category(將只有一個因爲它們必須是唯一索引)
  • 使用索引中的陣列m-shirts

或更短:

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

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

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

有了這一點,你可以訪問的結果,你需要哪個方式,包括foreach或通過一些面向收集法,如array functionsiterators。在這種情況下,array_rand可用於選取隨機數組元素。

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

該手冊應該是您在編寫操作前的第一站。 SPL尤其具有許多有用的功能類別&功能,但不要忽略整個function reference(不再是一個準確的名稱,因爲列出了許多類;「擴展接口參考」更準確)。

然而,這回避了是否要在PHP中實現數據存儲或使用外部數據庫,其已經具備了標準的操作安全,高效的實現問題。你寫的東西容易:

  1. 效率較低,
  2. 是buggier,
  3. 有較少的特點,
  4. 採取寶貴的開發時間陣列中設計和實施
+0

嗨,Outis,謝謝你的時間。雖然這個解決方案有效,但我無法弄清楚如何爲每個隨機選擇的產品返回密鑰(我的id)。 但是,我已將您在此處和上述註釋中解釋的所有內容納入考慮範圍,並且我將在下一個php項目中引用您的提示。 謝謝! –

+0

@MatthewBarnes:閱讀'array_rand'的文檔。其實,閱讀所有鏈接的文檔。 – outis