в PHP Как я могу сделать массив ("один", "два", "три") в $ somearray ["один"] ["два"] ["три"]? - PullRequest
0 голосов
/ 19 ноября 2010

Я хотел бы взять массив, скажем:

array("one", "two", "three");

и превратить его в массив массивов, например:

$someArray["one"]["two"]["three"];

Массив массивов ($someArray) должен был бы быть создан каким-то циклом, так как исходный массив создается explode(), поэтому я не знаю, насколько глубоким будет $someArray.

Надеюсь, это понятно, спасибо всемна ваше время!

Я сейчас читаю об этом, будет ли array_map() работать на это?

Ответы [ 4 ]

4 голосов
/ 19 ноября 2010

Вы можете сделать это:

$path = array("one", "two", "three");
$ref = &$arr;
foreach ($path as $key) {
    if (!isset($ref[$key])) break;
    $ref = &$ref[$key];
}

В конце $ref - ссылка на $arr['one']['two']['three'], если она существует. И если вы замените break на $ref[$key] = array(), вы создадите массив с этой структурой.

1 голос
/ 19 ноября 2010

Вы должны использовать array_reduce . Решение довольно простое.

Чтобы сделать трюк, разверните массив и только затем примените сокращение.

$a = array('a','b','c');
$x = array_reduce(array_reverse($a), function ($r, $c) {
        return array($c=>$r);
     },array());

РЕДАКТИРОВАТЬ расширенная и поясненная версия:

В php у нас нет функции, позволяющей автоматически углубляться в массив, но мы этого не делаем. Если вы начнете снизу, мы сможем заключить массив в предыдущий с простым заданием.

$a = array('a','b','c');
$result=array(); // initially the accumulator is empty
$result = array_reduce(
    array_reverse($a), 
    function ($partialResult, $currentElement) {
        /* enclose the partially computed result into a key of a new array */
        $partialResult = array($currentElement=>$partialResult); 
        return $partialResult;
    }, 
    $result
);

Кстати, я предпочитаю более короткую форму. Я думаю, что это функциональная идиома и не требует дальнейшего объяснения для среднего опытного разработчика (с небольшим количеством функционального фона). Второй добавляет много шума, что, это удобно учиться, но источник отвлечения в производственный код (, очевидно, я имею в виду функцию только с оператором возврата ).

0 голосов
/ 19 ноября 2010
$arrNew = array();
$ref = &$arrNew;
$arrParts = array("one", "two", "three");

foreach($arrParts as $arrPart){

   $ref[$arrPart] = array(); 
   $ref = &$ref[$arrPart];
}

Когда вы печатаете $ arrNew, он напечатает это ..

Array
(
    [one] => Array
        (
            [two] => Array
            (
                [three] => Array
                    (
                    )

            )

    )

)

0 голосов
/ 19 ноября 2010

Я не уверен, почему ты этого хочешь.

Но основа того, что вы хотите, была бы такой

$numbers = array("one", "two", "three");

$array = array();
$pointer = &$array;

$last_val = NULL;

foreach($numbers as $key => $val){
     if(!empty($pointer[$last_val])){
         $pointer = &$pointer[$last_val];
         $pointer = new array($val);
         $last_val = $val;
     }else{
         $pointer = new array($val);
         $last_val = $val;
     }
}

Это должно тогда соответствовать тому, что вы хотите $ массив;

Это не проверено, но я думаю, что это должно работать, если оно не просто скажет мне, что он делает, и я посмотрю

...