многомерный массив - PullRequest
       7

многомерный массив

0 голосов
/ 31 января 2010

Я хочу создать многомерный массив на основе строки.

строка имеет значение $string="1/2/3"

и я хочу назначить $array[1][2][3]=somethimg

на самом деле индекс массива описан внутри $ string

Строка $ имеет разную глубину.

Например, может быть $ string = "1/2 OR $ string =" 1/2/3/4/5 ИЛИ $ string = "1/2/3/5/7/8/9/9/6 поэтому количество ключей в многомерном массиве не является стандартным

Любые идеи.

Ответы [ 4 ]

2 голосов
/ 31 января 2010
$string = '1/2/3';
list($x, $y, $z) = explode('/', $string);

$array[$x][$y][$z] = 'something';
1 голос
/ 31 января 2010

Попробуйте с

<code><?php
$ind = '1/2/3/4/5/6/7/8/9/10/11/12';

$ind = '[' . join('][', explode('/',$ind)) . ']';
$fn = create_function('$var, $val','global ${$var}; ${$var}'. $ind. '= $val;');
$array = array();
$fn("array", "something");
echo '<pre>'.print_r($array, true).'
'; ?>

Гораздо более простая версия

<code><?php
$ind = '1/2/3/4/5/6/7/8/9/10/11/12';
$ind = '[' . join('][', explode('/',$ind)) . ']';
$array = array();
$val = "something";
eval('$array'.$ind.'=$val;');
echo '<pre>'.print_r($array, true).'
'; ?>

Некоторые люди могут убить меня за функцию eval, но в этом случае она отлично работает: -P

0 голосов
/ 31 января 2010

Вот рекурсивное решение, которое будет работать для любого числа индексов:

function set_by_indices(&$arr, $indices, $val) {
  if (count($indices) == 1) {
    $arr[$indices[0]] = $val;
  } else {
    set_by_indices($arr[$indices[0]], array_slice($indices, 1), $val);
  }
}

$arr = array(array(array(1 => 1, 2 => 4),
                   array(1 => -1, 2 => -2)),
             array(array(1 => 11, 2 => 14),
                   array(1 => -11, 2 => -12)));
$str = '0/0/1';

$indices = explode('/', $str);

print_r($arr);
set_by_indices($arr, $indices, 99);
echo '<br/>';
print_r($arr);

Выход:

Array ( [0] => Array ( [0] => Array ( [1] => 1 [2] => 4 ) [1] => Array ( [1] => -1 [2] => -2 ) ) [1] => Array ( [0] => Array ( [1] => 11 [2] => 14 ) [1] => Array ( [1] => -11 [2] => -12 ) ) ) 
Array ( [0] => Array ( [0] => Array ( [1] => 99 [2] => 4 ) [1] => Array ( [1] => -1 [2] => -2 ) ) [1] => Array ( [0] => Array ( [1] => 11 [2] => 14 ) [1] => Array ( [1] => -11 [2] => -12 ) ) )
0 голосов
/ 31 января 2010

Предполагая ваш формат строки:

list($lev1, $lev2, $lev3) = explode('/', $string);
$array[$lev1][$lev2][$lev3] = $something;

После редактирования - вы можете использовать рекурсивную функцию, например:

$string = '1/2/3/4/5/6/7/8';
$value  = 'something';

print_r(build_array($string, $value));

function build_array($string, $value, $array = array()) {
    list($key, $rest) = explode('/', $string, 2);
    if ( $key ) {
        $array = array(
            $key => build_array($rest, $value, $array[$key])
        );
        return $array;
    } else {
        return $value;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...