2017-07-21 177 views
2

我有一個多維數組,其深度不確定或者取決於多少個類別&子類別(&子子類別) magento網站,因爲我打電話功能$product->getCategoryIds()檢查多維數組中的每個子數組是否包含元素

現在讓我們假設我得到的所有產品(這是在車/結帳加入)類樹的層次結構,多維數組象下面這樣:

Array 
(
    [0] => Array 
     (
      [0] => 40 
     ) 

    [1] => Array 
     (
      [0] => 40 
     ) 

    [2] => Array 
     (
     ) 

    [3] => Array 
     (
     ) 

    [4] => Array 
     (
      [0] => 16 
     ) 

    [5] => Array 
     (
      [0] => 16 
     ) 

) 

但因爲它是一個ecomerce網站的類別層次結構,可以可以想象,網站可以有任何深度的類別,子類別,子類別等等。未知的產品類別層次結構,因此未知深度類別ID數組。

現在我的困惑和查詢,如何檢查每個子數組和/或子子數組是否包含特定的類別ID(例如40或16)或不使用各種PHP數組的組合函數和儘可能少的循環?

我能想到的所有嵌套for/foreach循環有性能開銷,所以我正在尋找更好的替代方案。

+0

您是否需要知道該物品在哪裏或只有在那裏? – Andreas

+0

只需要知道每個子數組或子數組是否包含該項(在我的情況下是'category-id')。如果可以找到物品的位置,那麼真的很棒,但是「如果它存在或不存在」也是非常有用的。 – VST

+0

如果可以通過展平數組並使用in_array來完成。這是第一步。我猜如果這是真的,你需要一個遞歸函數來查找位置。 https://stackoverflow.com/questions/4128323/in-array-and-multidimensional-array https://stackoverflow.com/questions/526556/how-to-flatten-a-multi-dimensional-array-to-simple - 酮中的PHP – Andreas

回答

1

這聽起來像你正在尋找的東西是這樣的:

$ids = $product->getCategoryIds(); 
$non_empty_ids = array(); 
foreach ($ids as $key => $value) { 
    if (!count($value)) { 
     // The value has no offsets, lets skip this one 
     continue; 
    } 
    $non_empty_ids[] = $value; 
} 
0

您可以使用array_filter()時,你是不是從陣列

<?php 

$myarray = array('0' => 
       array('0' => '40'), 
       '1' => array('0' => '40'), 
       '2' => array(), 
       '3' => array(), 
       '4' => array('0' => '16'), 
       '5' => array('0' => '16'), 
       '6' => array('0' => 
        array('0' => '40'), 
        '1' => array('0' => '40'), 
        '2' => array(), 
        '3' => array(), 
        '4' => array('0' => '16'), 
        '5' => array('0' => '16') 
       ) 
      ); 

$b = array_map("array_filter", $myarray); 
echo "<pre>"; 
print_r(array_filter($b)); 
echo "</pre>"; 
?> 
Result: 
Array 
(
    [0] => Array 
     (
      [0] => 40 
     ) 

    [1] => Array 
     (
      [0] => 40 
     ) 

    [4] => Array 
     (
      [0] => 16 
     ) 

    [5] => Array 
     (
      [0] => 16 
     ) 

    [6] => Array 
     (
      [0] => Array 
       (
        [0] => 40 
       ) 

      [1] => Array 
       (
        [0] => 40 
       ) 

      [4] => Array 
       (
        [0] => 16 
       ) 

      [5] => Array 
       (
        [0] => 16 
       ) 

     ) 

) 
1

我更喜歡使用遞歸刪除空類別某些關於輸入(陣列的結構)

你可以使用類似這樣的東西

function searchCategoriesForValue(array $array, array $needles) 
{ 
    $matchsCount = 0; 
    foreach ($array as $element){ 
     if(is_array($element)){ 
      $matchsCount += searchCategoriesForValue($element, $needles); 
     }else{ 
      if(in_array($element, $needles)){ 
       $matchsCount ++; 
      } 
     } 
    } 
    return $matchsCount; 
} 

示例用法

<?php 
// nested array that has the number 16 six times. 
$array = [ [0,1,2,3,[16,40,[0,1]]], 
      [0,1,2,3,[16,40,[0,1]]], 
      [0,1,2,3,[16,40,[0,1]]], 
      [0,1,2,3,[16,40,[0,1]]], 
      [0,1,2,3,[16,40,[0,1]]], 
      [], 
      [0,1,2,3,[16,40,[0,1]]]]; 
$count = searchCategoriesForValue($array,[16]); 
// 16 has been found 6 times 
var_dump($count); 
$count = searchCategoriesForValue($array,[16,40]); 
// 16 and 40 have been found 12 times 

exit; 

此輸出

INT(6)

現場演示(https://eval.in/835973);

相關問題