質問

I have an array like

                Array
                (
                    [0] => Array
                        (
                            [id] => 81
                            [cata_key] => 908cbbcb86a1cf64b67c96ff
                            [cata_name] => Lunch
                            [app_key] => 2fabc0d9447c6375657dead4
                            [parentid] => 0
                            [subcategories] => Array
                                (
                                )

                        )

                    [1] => Array
                        (
                            [id] => 80
                            [cata_key] => baac98b4e73c05ebbf45bdc6
                            [cata_name] => Break Fast
                            [app_key] => 2fabc0d9447c6375657dead4
                            [parentid] => 0
                            [subcategories] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 82
                                            [cata_key] => 5970b7afc450ef3b24573de9
                                            [cata_name] => Rise Products
                                            [app_key] => 2fabc0d9447c6375657dead4
                                            [parentid] => 80
                                            [subcategories] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [id] => 83
                                                            [cata_key] => 82e36d8f821e14fc8db1d4da
                                                            [cata_name] => Dosha
                                                            [app_key] => 2fabc0d9447c6375657dead4
                                                            [parentid] => 82
                                                            [subcategories] => Array
                                                                (
                                                                    [0] => Array
                                                                        (
                                                                            [id] => 84
                                                                            [cata_key] => 49730020d850439dd7de8747
                                                                            [cata_name] => Masala Dosha
                                                                            [app_key] => 2fabc0d9447c6375657dead4
                                                                            [parentid] => 83
                                                                            [subcategories] => Array
                                                                                (
                                                                                )

                                                                        )

                                                                )

                                                        )

                                                )

                                        )

                                )

                        )

                )

I would like to find the depth of the root indexed sub array from a particular inner array id. For example I would like to find the depth of the root indexed array from the parentid=0, it should be 1. The depth of the root indexed sub array from the parentId=0/80/82/83 should be 4.

Actually my aim is to limit the depth of an array. There should a depth limit. So when any one try to add a sub array to this array , we should find out the current array depth . For example the array depth limit is 4 , and any one try to add a sub array under cata_name= Masala Dosha, the depth already reached and should not allow to add new sub array. But at the same time he can add a sub array under [cata_name] => Lunch, because its depth is only 1 and the depth limit is 4.

役に立ちましたか?

解決

try this , it work but i dont like this

http://sandbox.onlinephpfunctions.com/code/9922bf9abec89477e5bd3a81c41feb953db604a1

$a=array(
array('id'=>81),
array('id'=>80,'subcategories'=>array('id'=>82,'subcategories'=>array('id'=>83,'subcategories'=>array('id'=>84,'subcategories'=>array())))),
);

echo "80:" . test($a,80);
echo PHP_EOL;
echo "81:" . test($a,81);
echo PHP_EOL;
echo "82:" . test($a,82);
echo PHP_EOL;
echo "83:" . test($a,83);


function test($a,$key){
    $aa=array();
    foreach($a as $v){
    $b=array();
    $content=print_r($v,true);
    $b['content']=$content;
    if(preg_match('/ {28}\[/',$content)){
    $b['over']=1;
    }else{
    $b['over']=0;
    }
    $aa[]=$b;
    }

    foreach($aa as $v){

        if(preg_match('/\[id\] => '.$key.'/',$v['content'])){
            return $v['over'];

        }

    }
    return 0;

}

then

80:1
81:0
82:1
83:1

他のヒント

I see you have excepted an answer, but here's an alternative:

<?php
$arrayHandler = new ArrayHandler();
$arr = array();
//Adding array examples (without checking)
$arr[0]['subcategories'] = array('id'=>80);
$arr[0]['subcategories']['whatever'] = array('id'=>82);
$arr[0]['subcategories']['whatever']['whatever2'] = array('id'=>83);

//Will be added because this is fourth level from $arr[0]
$chk = $arrayHandler->addSubArray($arr[0], $arr[0]['subcategories']['whatever']['whatever2']['whatever3']); 
if ($chk !== false) {
    $arr[0]['subcategories']['whatever']['whatever2']['whatever3'] = array('id'=>84);
}

//Won't be added because this is fitfth level from $arr[0]
$chk = $arrayHandler->addSubArray($arr[0], $arr[0]['subcategories']['whatever']['whatever2']['whatever3']['whatever4']); 
if ($chk !== false) {
    $arr[0]['subcategories']['whatever']['whatever2']['whatever3']['whatever4'] = array('id'=>85);
}
echo print_r($arr,true);



class ArrayHandler {
    private $depthLimit = 4;
    private $depth = 1;


    public function addSubArray($checkFromNode, $addNode) {
        if (is_array($checkFromNode)) {
            //Do recursion as long as node is an array and count depth
            //If not an array anymore return value sent to this parameter
            foreach ($checkFromNode as $key=>$node) {
                if (is_array($node)) {
                    $this->depth++; 
                    $this->addSubArray($node, $addNode);
                }                       
            }

            if (intval($this->depth) > intval($this->depthLimit)) {
                return false;
            }

            return true;
        }

    }

}
?>

Output would be in example:

Array ( [0] => Array ( [subcategories] => Array ( [id] => 80 [whatever] => Array ( [id] => 82 [whatever2] => Array ( [id] => 83 [whatever3] => Array ( [id] => 84 ) ) ) ) ) ) 
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top