Dynamic array keys

前端 未结 5 1387
误落风尘
误落风尘 2020-11-29 06:45

I have a string like this:

$string = \'one/two/three/four\';

which I turn it into a array:

$keys = explode(\'/\', $string);

相关标签:
5条回答
  • 2020-11-29 07:27

    it's corny but:

    function setValueByArrayKeys($array_keys, &$multi, $value) {
         $m = &$multi
         foreach ($array_keys as $k){
             $m = &$m[$k];
         }
         $m = $value;
    }
    
    0 讨论(0)
  • 2020-11-29 07:28
    $string = 'one/two/three/four';
    $keys = explode('/', $string);
    $arr = array(); // some big array with lots of dimensions
    $ref = &$arr;
    
    while ($key = array_shift($keys)) {
        $ref = &$ref[$key];
    }
    
    $ref = 'value';
    

    What this is doing:

    • Using a variable, $ref, to keep track of a reference to the current dimension of $arr.
    • Looping through $keys one at a time, referencing the $key element of the current reference.
    • Setting the value to the final reference.
    0 讨论(0)
  • 2020-11-29 07:35

    This is kind of non-trivial because you want to nest, but it should go something like:

    function insert_using_keys($arr, $keys, $value){
        // we're modifying a copy of $arr, but here
        // we obtain a reference to it. we move the
        // reference in order to set the values.
        $a = &$arr;
    
        while( count($keys) > 0 ){
            // get next first key
            $k = array_shift($keys);
    
            // if $a isn't an array already, make it one
            if(!is_array($a)){
                $a = array();
            }
    
            // move the reference deeper
            $a = &$a[$k];
        }
        $a = $value;
    
        // return a copy of $arr with the value set
        return $arr;
    }
    
    0 讨论(0)
  • 2020-11-29 07:41
        $arr['one']['two']['three']['four'] = 'value';
    
        $string = 'one/two/three/four';
        $ExpCheck = explode("/", $string);
        $CheckVal = $arr;
        foreach($ExpCheck AS $eVal){
            $CheckVal = $CheckVal[$eVal]??false;
            if (!$CheckVal)
                break;
        }
        if ($CheckVal) {
            $val =$CheckVal;
        }
    

    this will give u your value in array.

    0 讨论(0)
  • 2020-11-29 07:44

    You'll need to first make sure the key's exist, then assign the value. Something like this should work (untested):

    function addValueByNestedKey(&$array, $keys, $value) {
        $branch = &$array;
        $key = array_shift($keys);
        // add keys, maintaining reference to latest branch:
        while(count($keys)) {
            $key = array_pop($keys);
            if(!array_key_exists($key, $branch) {
                $branch[$key] = array();
            }
            $branch = &$branch[$key];
        }
        $branch[$key] = $value;
    }
    
    // usage:
    $arr = array();
    $keys = explode('/', 'one/two/three/four');
    
    addValueByNestedKey($arr, $keys, 'value');
    
    0 讨论(0)
提交回复
热议问题