मेरे पास कई उपश्रेणियाँ हैं जिनमें कई उपश्रेणियाँ हैं, प्रत्येक उप श्रेणियों की अपनी उप श्रेणियां हैं और इसी तरह ...

array(1) {
["categories"]=>array(11) {
[0]=>array(4) {
  ["id"]=>int(368)
  ["name"]=>string(8) "Aksesuar"
  ["parentId"]=>NULL
  ["subCategories"]=>array(15) {
    [0]=>
    array(4) {
      ["id"]=>
      int(387)
      ["name"]=>
      string(4) "Saat"
      ["parentId"]=>
      int(368)
      ["subCategories"]=>
      array(0) {
      }
    }
    [1]=>
    array(4) {
      ["id"]=>
      int(394)
      ["name"]=>
      string(6) "Şapka"
      ["parentId"]=>
      int(368)
      ["subCategories"]=>
      array(0) {
      }
    }
    [2]=>
    array(4) {
      ["id"]=>
      int(396)
      ["name"]=>
      string(17) "Takı & Mücevher"
      ["parentId"]=>
      int(368)
      ["subCategories"]=>
      array(17) {
        [0]=>
        array(4) {
          ["id"]=>
          int(397)
          ["name"]=>
          string(8) "Bileklik"
          ["parentId"]=>
          int(396)
          ["subCategories"]=>
          array(7) {
            [0]=>
            array(4) {
              ["id"]=>
              int(1238)
              ["name"]=>
              string(15) "Altın Bileklik"
              ["parentId"]=>
              int(397)
              ["subCategories"]=>
              array(0) {
              }
            }

इस उपश्रेणियों में से प्रत्येक में पेरेंट आईडी है जो मूल श्रेणी को इंगित करता है, अधिकांश शीर्ष मूल श्रेणी में पैरेंट आईडी शून्य है। मुझे एक पुनरावर्ती फ़ंक्शन की आवश्यकता है जिसे मैं उपश्रेणी की आईडी और श्रेणियों की सरणी के रूप में पैरामीटर दूंगा, और यह इसके सम्मान उपश्रेणियों के साथ मूल श्रेणियों की सरणी लौटाएगा।

function recursive($needle, $array, $id, $holder = [])
{
$holder = [];
foreach ($array as $key => $value) {
    if ($key == $needle && $value == $id) {
        $holder = array_merge($holder, $array);
    }
    if (is_array($value)) {
        $holder = array_merge($holder, recursive($needle, $value, $id, $holder));
    }
}

return $holder;
}
$res = recursive('id', $categories, 5208);

उपरोक्त फ़ंक्शन केवल उप श्रेणियों के साथ मूल श्रेणी की सरणी लौटाता है।

0
Kamran Kamilli 3 अक्टूबर 2021, 17:27
क्या आप कृपया अपने आवश्यक परिणाम को थोड़ा और स्पष्ट कर सकते हैं। आइए आपके द्वारा प्रदान किए गए डेटा को लें। यदि आप 'पुनरावर्ती ('आईडी', $ श्रेणियां, 397)' कहते हैं, तो क्या आप पूरे पेड़ को जड़ से पाए गए तत्व (इसलिए 368-> 396-> 397) की अपेक्षा करते हैं? क्या मिली श्रेणी (1238) की उपश्रेणियों को भी वापस करने की आवश्यकता है?
 – 
vixducis
3 अक्टूबर 2021, 18:31
जब आप 397 पास करते हैं तो आपको यह श्रेणी और इसकी उप श्रेणियां ही मिलेंगी, मुझे 397 मूल श्रेणियों सहित पूरे पेड़ को प्राप्त करने की आवश्यकता है। उदाहरण के लिए जब मैं सबसे कम उप श्रेणी पास करता हूं तो मुझे इसकी सभी मूल श्रेणी प्राप्त करने की आवश्यकता होती है, यदि उपरोक्त सरणी में सबसे कम 1238 है तो यह मुझे 368->396->397->1238 लौटाएगा
 – 
Kamran Kamilli
3 अक्टूबर 2021, 18:42
ठीक है, समझा, लेकिन क्या मिली श्रेणी की उपश्रेणियों को भी वापस करने की आवश्यकता है?
 – 
vixducis
3 अक्टूबर 2021, 19:44
नहीं, केवल उप श्रेणी की मूल श्रेणियां
 – 
Kamran Kamilli
3 अक्टूबर 2021, 20:09

1 उत्तर

सबसे बढ़िया उत्तर

मुझे पूरी तरह से यकीन नहीं है कि 'धारक' फ़ंक्शन चर का उपयोग क्या था, क्योंकि आप इसे प्रत्येक कॉल पर एक खाली सरणी पर रीसेट करते हैं, इसलिए मैंने इसे पूरी तरह से हटा दिया।

function recursive(string $needle, array $categories, $id): ?array
{
    foreach ($categories as $cat) {
        if (array_key_exists($needle, $cat) && $cat[$needle] === $id) {
            // make sure that if correct category is found,
            // no subcategories will be included
            unset($cat['subCategories']);
            return $cat;
        } else {
            $subCat = recursive($needle, $cat['subCategories'], $id);
            // if the $subCat is not null, it indicates the category 
            // with the correct id, or one of it's parent has been found
            if ($subCat !== null) {
                $cat['subCategories'] = $subCat;
                return $cat;
            }
        }
    }
    return null;
}

यह वास्तव में इतना जटिल नहीं है, फ़ंक्शन एक सरणी देता है यदि आईडी उसमें पाई गई थी या एक यदि यह बच्चे हैं, या NULL यदि कुछ भी नहीं मिला है।

फ़ंक्शन प्रदान किए गए स्तर के लिए श्रेणियों पर लूप करता है, और यह जांचता है कि वर्तमान स्तर में प्रदान की गई आईडी है या नहीं। यदि नहीं, तो यह सभी उपश्रेणियों को खोजेगा। यदि उपश्रेणी में कुछ पाया जाता है, तो यह वर्तमान उपश्रेणियों को लौटाए गए उपश्रेणियों से बदल देगा और श्रेणी को भी वापस कर देगा।

यदि आप किसी वर्ग को किसी श्रेणी के चारों ओर लपेटते हैं तो यह और भी साफ हो सकता है, लेकिन इससे काम पूरा हो जाना चाहिए। कृपया मुझे बताएं कि क्या आपके कोई और प्रश्न हो सकते हैं।

पूर्ण रेप्रो केस के लिए यह 3v4l देखें।

0
vixducis 3 अक्टूबर 2021, 22:14
यह पूरी तरह से काम करता है, धन्यवाद
 – 
Kamran Kamilli
3 अक्टूबर 2021, 22:52