добавить строку в массив относительно URI в PHP - PullRequest
1 голос
/ 12 октября 2011

не может понять, как вставить новую строку в определенном расположении в массиве относительно данного URI.

, чтобы быть более конкретным,

Я пытаюсь создатьфункция, подобная следующей:

function insertNewFolder($name, $path){

  $struct = json_decode( file_get_contents('structure.json'), true );

  //at this place I want to include $name in the array according the given $path
}

давайте предположим, что $ struct является следующим массивом:

$struct = array( 'folder' => array('subfolder1', 'subfolder2') );

ПРИМЕЧАНИЕ: область действия может содержать более одной подпапки.пример: array( 'folder' => array( 'subfolder' => array( 'subsubfolder' )));

Если я вызову метод, подобный этому insertNewFolder('subfolder3', 'folder');, результирующий массив должен быть:

$struct = array( 'folder' => array('subfolder1', 'subfolder2', 'subfolder3') );

Это моя попытка:

function insertNewFolder($name, $path){

  ...

  // insert the new folder according the path
  $segments = explode('/', $path);

  $arr_path = '';
  foreach( $segments as $s ){
    $arr_path .= "['$s']";
  }
  eval("/$menu$arr_path[] = '$name';");

  ...
}

Это сработало бы, если бы метод eval не вызывал исключение:

Parse error: syntax error, unexpected ']', expecting T_STRING or T_VARIABLE or T_NUM_STRING on line 16

Прошу вашей помощи, есть ли лучший способ достичь этого конца или как округлить это исключение?

С уважением

Ответы [ 3 ]

2 голосов
/ 12 октября 2011

Вы можете сделать что-то похожее на this ( demo ):

function insertValueByPath($array, $path, $value) {
    $current = &$array;
    foreach (explode('/', $path) as $part) {
        $current = &$current[$part];
    }
    $current = $value;

    return $array;
}

$struct = array(
    'folder' => array(
        'subfolder1' => array(),
        'subfolder2' => array(),
    ),
);

$struct = insertValueByPath($struct, 'folder/subfolder1/subsubfolder', array());
$struct = insertValueByPath($struct, 'folder/subfolder2/subsubfolder/subsubsub/subsubsubsub', array('hallo'));
0 голосов
/ 12 октября 2011

Структура составных данных не нормализована, что затрудняет решение вашей проблемы.

См. Первый пример, который вы дали:

array( 'folder' => array('subfolder1', 'subfolder2') );

Папка является ключом массива для folder, но имена подпапок являются значениями массива.

Ваш второй пример проясняет это еще более:

array( 'folder' => array( 'subfolder' => array( 'subsubfolder' )));

Теперь у вас есть проблема, чтобы справиться с каждым вероятным случаем с вашей операцией вставки, но вы не написали в своем вопросе, как обращаться с различными случаями, например, куда вы хотите вставить, что и как path сопоставляет со значениями ключей или .

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

0 голосов
/ 12 октября 2011

Я не совсем уверен, что вы хотите, но чтобы получить результат, который вы хотите, почему бы не использовать:

function insertNewFolder($name, $path){
   $struct[$name][]=$path;
}

Кроме того, старайтесь избегать eval (). На 99,99% можно обойтись без ...

Если у вас есть многомерный массив, что-то вроде:

$segments = explode('/', $path);

  $arr_path = '';
  $tmp_struct=&$struct;
  for ($i=0;$i<(count($segments)-1);$i++) {
    if (!isset($tmp_struct[$segments[$i]]) {
      $tmp_struct[$segments[$i]]=1;
    }
      $tmp_struct=$tmp_struct[$segments[$i]];
  }
$tmp_struct[$segments[count($segments)-1]]=$name;
...