2011-02-11 3 views
1

У меня есть скрипт, который обрабатывает именование родительских/дочерних элементов на другой странице. Формат имени похож на E5-2-3, который представляет третий дочерний элемент второго дочернего элемента пятого элемента.PHP - Увеличение массива на основе позиции индекса

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

(я надеюсь, что это имеет некоторый смысл для кого-то)

Массив индекса выглядит примерно так:

1=>null 
2=>null 
3=> 
    1=>null 
    2=>null 
    3=> 
     1=>null 
4=>null 
5=> 
    1=>null 
    2=> 
     1=>null 
     2=>null 
     3=>null //the element I was talking about above 
6=> 
    1=>null 
7=>null 

Мой код до сих пор является

$projectNumber = $_GET['project_number']; 
    @$parentNumber = $_GET['parent_number']; //suppressed as it may not be set 

    $query = mysql_query("SELECT e_numbers FROM project_management WHERE project_number = '$projectNumber'"); 
    $resultArray = mysql_fetch_assoc($query); 
    $eNumbers = unserialize($resultArray['e_numbers']); 

    if (!is_array($eNumbers)&&!isset($parentNumber)){ //first e_number assigned 
     $eNumbers[1] = null; //cant possibly have children so null for now 
     $nextENumber = 'E1'; 
    }else{ 
     if (!isset($parentNumber)){ 
      $nextNumber = count($eNumbers)+1; 
      $eNumbers[$nextNumber] = null; //cant possibly have children so null for now 
      $nextENumber = 'E'.$nextNumber; 
     }else{ 
      $parentIndex = explode('-', str_replace('E', '', $parentNumber)); 
      //$nextENumber = //assign $nextENumber the incremented e number 
     } 
    } 

    echo $nextENumber; 

      //(then goes on to update sql etc etc) 

Это все хорошо, но для строки, где мне нужно получить/назначить глубокие числа. Я думаю, что это должна быть какая-то рекурсивная функция, основанная на массивах $parentIndex и $eNumbers, однако я немного из глубины, когда речь идет о рекурсии.

Любая указатель в правильном направлении будет большой помощью.

PS Если есть лучший способ справиться с возрастающими родительскими/дочерними отношениями, я все уши. Единственным, что вне моего контроля формата чисел, передаваемый в/из (Должно быть EX-Y-Z-...)

UPDATE я смог развить @ircmaxell функции «s функционировать более лучше в моем контексте. Функция потребовала, чтобы вы передали массив с нулевым значением (может быть пустым) и необязательный путь. Он возвращает новый путь и обновляет массив индексов, чтобы включить новый путь. Сообщение об ошибке возвращается, если индекс не найден.

function getNextPath(&$array, $path) { //thanks to ircmaxell @ stackoverflow for the basis of this function 
      $newPath = ''; 
      $tmp =& $array; 
      if (is_string($path)) { 
       $path = explode('-', str_replace('E', '', $path)); 
       $max = count($path);    
       foreach ($path as $key => $subpath) { 
        if (is_array($tmp)) { 
         if (array_key_exists($subpath, $tmp)){ 
          $tmp =& $tmp[$subpath]; 
           $newPath[] = $subpath; 
         }else{ 
          return "Parent Path Not Found"; 
         } 

        } 
       } 
      }   
      $tmp[] = null; 
      $newPath[] = count($tmp)-1; 
      if (count($newPath)>1){ 
       $newPath = implode('-', $newPath); 
      }else{ 
       $newPath = $newPath[0]; 
      }   
      return "E".$newPath; 
     } 
+0

"// подавлено, поскольку оно не может быть установлено" --- 1) что это "оно"? 2) 'isset' – zerkms

+0

Thats parent_number. Это строка типа ''E5-2-3'' –

ответ

0

Вот один из способов:

function incrementPath(&$array, $path) { 
    if (is_string($path)) { 
     $path = explode('-', str_replace('E', '', $path); 
    } 
    $tmp =& $array; 
    foreach ($path as $subpath) { 
     if (is_array($tmp) && isset($tmp[$subpath])) { 
      $tmp =& $tmp[$subpath]; 
     } else { 
      return false; // Could not find entire path 
     } 
    } 
    $tmp++; 
    return true; 
} 

Теперь, если вы хотите, чтобы динамически создавать пути, просто измените return false; на:

$tmp[$subpath] = array(); 
$tmp =& $tmp[$subpath]; 

А затем добавьте чек после цикла чтобы убедиться, что это не целое число, и явно установлено на 0, если оно не ...

Ed это: AHHH, теперь я понимаю:

function getNextPath(&$array, $path) { 
    if (is_string($path)) { 
     $path = explode('-', str_replace('E', '', $path); 
    } 
    $newPath = ''; 
    $tmp =& $array; 
    $max = count($path) - 1; 
    foreach ($path as $key => $subpath) { 
     if (is_array($tmp) && isset($tmp[$subpath])) { 
      $tmp =& $tmp[$subpath]; 
      if ($key < $max) { 
       $newPath .= '-'.$subpath; 
      } 
     } else { 
      return 'E' . ltrim($newPath . '-1', '-'); // Could not find entire path 
     } 
    } 
    if (is_array($tmp)) { 
     return 'E' . ltrim($newPath . '-' . count($tmp), '-'); 
    } else { 
     //it's a value, so make it an array 
     $tmp = array(); 
     return 'E' . ltrim($newPath . '-' . 1, '-'); 
    } 
} 

Я думаю, что должен делать то, что вы хотите (он возвращает следующий доступный путь под то, что вы ищете). }

+0

Я не совсем понимаю вашу функцию. Какова цель '$ tmp ++'? –

+0

@ Zak: Вы сказали, что хотите увеличить массив. Таким образом, это увеличивает число в этом месте. Если вы имели в виду возврат, просто возвращайте $ tmp; '. – ircmaxell

+0

Правый темп передавался как ссылка. Извините, что пропустил ссылку. Поэтому для реализации я бы поставил 'if (!incrementPath ($ eNumbers, $ parentNumber)) { \t \t \t \t \t echo "Path not found"; \t \t \t \t} 'в мою петлю? –

Смежные вопросы