2017-07-21 2 views
2

J'ai un tableau multidimensionnel dont la profondeur est incertaine ou disons dépend de combien de catégories & sous-catégories (& sous-sous-catégories) sont là dans Site Web Magento, que j'appelle la fonction $product->getCategoryIds().Vérifiez si chaque sous-tableau d'un tableau multidimensionnel contient un élément ou non

Maintenant, supposons-je obtenir de tous les produits (qui sont ajoutés dans le panier/caisse) catégorie hiérarchie d'arbres tableau comme multidimensionnel comme ci-dessous:

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

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

    [2] => Array 
     (
     ) 

    [3] => Array 
     (
     ) 

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

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

) 

Mais comme il est la catégorie de heirarchy d'un site ecomerce, vous pouvez Imaginez en toute sécurité, le site pourrait avoir n'importe quelle profondeur de catégories, sous-catégories, sous-sous-catégories et ainsi de suite. Hiérarchie inconnue des catégories de produits donc profondeur inconnue du tableau ids de la catégorie. Voici maintenant ma confusion et ma requête, comment vérifier si chaque sous-matrice et/ou sous-sous-matrice contient un identifiant de catégorie particulier (par exemple 40 ou 16) ou non, en utilisant une combinaison de différents tableaux php fonctions et en utilisant autant de boucles que possible? Tout ce que je peux penser est imbriqué for/foreach boucles qui a des frais généraux de performance, donc je suis à la recherche de meilleures alternatives à cela.

+0

Avez-vous besoin de savoir où cet article est ou seulement si c'est là? – Andreas

+0

Juste besoin de savoir si chaque sous-tableau ou sous-sous-tableau contient l'élément (dans mon cas 'category-id') ou non. Si l'emplacement de l'élément peut être trouvé alors vraiment génial, mais "si c'est là ou non" est également très utile. – VST

+0

Si c'est le cas, cela peut être fait en aplatissant le tableau et en utilisant in_array. C'est la première étape. Je suppose que si c'est vrai, vous avez besoin d'une fonction récursive pour trouver l'emplacement. https://stackoverflow.com/questions/4128323/in-array-and-multidimensional-array https://stackoverflow.com/questions/526556/how-to-flatten-a-multi-dimensional-array-to-simple -one-in-php – Andreas

Répondre

1

On dirait que vous cherchez quelque chose comme ceci:

$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

Vous pouvez utiliser array_filter() pour supprimer les catégories vides du tableau

<?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

Je préfère utiliser récursion quand vous n'êtes pas certain sur l'entrée (la structure de la matrice)

vous pouvez utiliser quelque chose comme

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; 
} 

Exemple d'utilisation

<?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; 

ce sort

int (6)

démo (https://eval.in/835973);