2017-07-21 140 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);

相关问题