2016-08-10 1 views
3

У меня есть ниже Array Структура для $array.Найти родительские ключи в иерархии в PHP

Array 
    (
     [WIDGET_BUILDER_CREATE] => Array 
     (
     [TITLE] => Widget Builder 
     [WIDGET_TYPE_LBL] => Select Widget Type 
     [RANGE_LBL] => Select Range 
     [RANGE_TYPE_LBL] => Select Range Type 
     [TOP_SERVICE_CHKBOX] => Top Services 
     [SR_STATE_LBL] => Select Sr States 
     [SR_TYPE_LBL] => Select Sr Types 
     [SR_CATEGORY_LBL] => Select Sr Categories 
     [SR_SOURCE_LBL] => Select Sources 
     [SR_PROVIDER_LBL] => Select Sr Provider 
     [ADDRESS] => Enter Address 
     [SUBMIT_BTN] => Generate Data 
     [CHART_DIV] => Array 
      (
       [TYPE] => Select chart type 
       [SAVE_BTN] => Save Widget 
       [SERIES_NAME] => Change Parameters 
       [PARA_DIALOG] => Array 
        (
         [TITLE] => Chart Parameters 
         [SERIESNAME] => Series Name 
         [YAXISNAME] => Y axies name 
         [VALIDATION] => Array 
          (
           [SERIESNAME] => Please enter series name 
           [YAXISNAME] => Please enter y axis name 
          ) 

         [SAVE_BTN] => Save 
         [CANCEL_BTN] => Cancel 
        ) 

       [SAVE_DIALOG] => Array 
        (
         [TITLE] => Save Chart 
         [CHART_NAME] => Chart Name 
         [SHOW_TO_USER] => System Widget 
         [VALIDATION] => Array 
          (
           [CHART_NAME] => Please enter chart name 
          ) 

         [SAVE_BTN] => Save 
         [CANCEL_BTN] => Cancel 
        ) 

      ) 

     [GRID_DIV] => Array 
      (
      ) 

    ) 

) 

Проблема:

Я хочу построить function в PHP как если я вхожу в value, то он должен вернуть все parent keys в иерархии.

Скажем, например, если я введу Please enter y axis name, он должен вернуться в

$array['WIDGET_BUILDER_CREATE']['CHART_DIV']['PARA_DIALOG']['VALIDATION']['YAXISNAME']; 

Edit: Я пытался как How to get hierarchy path of an element in an Array но он возвращает в виде строки, но я хочу, как array key indexed. Это означает, что

print_r($array['WIDGET_BUILDER_CREATE']['CHART_DIV']['PARA_DIALOG']['VALIDATION']['YAXISNAME']); 

//returns Please enter y axis name 

Я использую PHP 5.5.9

+0

Я не понимаю. Функция должна вернуть то же значение, которое вы ввели? В вашем примере '$ array ['WIDGET_BUILDER_CREATE'] ...' фактически вернет строку '' Пожалуйста, введите имя оси y '' – BeetleJuice

+0

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

+0

Мне нужен путь массива – Hiranya

ответ

0

Если вы чувствуете, как вы могли бы использовать быстрый & грязный подход, вы можете попробовать function ниже, который использует вложенную foreach Петли. Но тогда, если вы чувствуете себя выдуманным, вы можете просто реорганизовать вложенные петли самостоятельно и превратить их в более короткий рекурсивный алгоритм. Чтобы проверить эту Быстрого & Грязной метода, идти here:

SAMPLE DATA:

<?php 

    $array = [ 
     'WIDGET_BUILDER_CREATE' => [ 
      "TITLE"     => "Widget Builder", 
      "WIDGET_TYPE_LBL"  => "Select Widget Type", 
      "RANGE_LBL"    => "Select Range", 
      "RANGE_TYPE_LBL"  => "Select Range Type", 
      "TOP_SERVICE_CHKBOX" => "Top Services", 
      "SR_STATE_LBL"   => "Select Sr States", 
      "SR_TYPE_LBL"   => "Select Sr Types", 
      "SR_CATEGORY_LBL"  => "Select Sr Categories", 
      "SR_SOURCE_LBL"   => "Select Sources", 
      "SR_PROVIDER_LBL"  => "Select Sr Provider", 
      "ADDRESS"    => "Enter Address", 
      "SUBMIT_BTN"   => "Generate Data", 
      "CHART_DIV"    => [ 
       "TYPE"   => "Select chart type", 
       "SAVE_BTN"  => "Save Widget", 
       "SERIES_NAME" => "Change Parameters", 
       "PARA_DIALOG" => [ 
        "TITLE"   => "Chart Parameters", 
        "SERIESNAME" => "Series Name", 
        "YAXISNAME"  => "Y axies name", 
        "VALIDATION" => [ 
         "SERIESNAME" => "Please enter series name", 
         "YAXISNAME"  => "Please enter y axis name", 

        ], 
        "SAVE_BTN"   => "Save", 
        "CANCEL_BTN"  => "Cancel", 
       ], 
       "SAVE_DIALOG" =>[ 
        "TITLE"   => "Save Chart", 
        "CHART_NAME" => "Chart Name", 
        "SHOW_TO_USER" => "System Widget", 
        "VALIDATION" => [ 
         "CHART_NAME" => "Please enter chart name", 
        ], 
        "SAVE_BTN"  => "Save", 
        "CANCEL_BTN" => "Cancel", 
       ], 

      ], 
      "GRID_DIV"    => [], 
     ], 
    ]; 

БЫСТРОГО & DIRTY ФУНКЦИИ:

<?php 

    function keywordLookUp(array $array, $keyWord, $arrayName="\$array"){ 
     $route = $mainKey = null; $arrRte = $arrResult = []; 
     foreach($array as $intKey=>$item){ 
      $mainKey = $route = "{$arrayName}['{$intKey}']"; 
      if(is_array($item)){ 
       foreach($item as $iKey=>$innerItem){ 
        if($lKey = array_search($keyWord, $item)){ 
         $route .= $s = "['$lKey']"; break; 
        } 
        if(is_array($innerItem)){ 
         foreach($innerItem as $iKey2=>$innerItem2){ 
          if($lKey = array_search($keyWord, $innerItem)){ 
           if(isset($s)){ 
           if(! array_search($route, $arrRte)){$arrRte[] = $route;} 
            $arrRte[] = "{$s}['$lKey']"; 
            $route .= "\n{$s}['$lKey']"; 
           }else{ 
            $route .= "['$iKey']['$lKey']"; 
           } $s  = str_replace("['$lKey']", "", $route); break; 
          } 
          if(is_array($innerItem2)){ 
           foreach($innerItem2 as $iKey3=>$innerItem3){ 
            if($lKey = array_search($keyWord, $innerItem2)){ 
             if(isset($s)){ 
              if(! array_search($route, $arrRte)){$arrRte[] = $route;} 
              $arrRte[] ="{$s}['$iKey2']['$lKey']"; 
              $route .= "\n{$s}['$iKey2']['$lKey']"; 
             }else{ 
              $route .= "['$iKey']['$iKey2']['$lKey']"; 
             } $s  = str_replace("['$iKey2']['$lKey']", "", $route); break; 
            } 
            if(is_array($innerItem3)){ 
             foreach($innerItem3 as $iKey4=>$innerItem4){ 
              if($lKey = array_search($keyWord, $innerItem3)){ 
               if(isset($s)){ 
                if(! array_search($route, $arrRte)){$arrRte[] = $route;} 
                $arrRte[] = "{$s}['$iKey3']['$lKey']"; 
                $route .= "\n{$s}['$iKey3']['$lKey']"; 
               }else{ 
                $route .= "['$iKey']['$iKey2']['$iKey3']['$lKey']"; 
               }break; 
              } 
             } 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     } 

     $fin = ($route == $mainKey) ? null : $route; 
     $fin = (!empty($arrRte) && sizeof($arrRte > 1))?$arrRte:$fin; 
     return $fin; 
    } 

    $path = keywordLookUp($array, "Please enter y axis name"); 
    $path2 = keywordLookUp($array, "Chart Parameters"); 
    $path3 = keywordLookUp($array, "Cancel"); 

    var_dump($path); 
    // PRODUCES:: string '$array['WIDGET_BUILDER_CREATE']['CHART_DIV']['PARA_DIALOG']['VALIDATION']['SERIESNAME']' (length=87) 

    var_dump($path2); 
    // PRODUCES:: string '$array['WIDGET_BUILDER_CREATE']['CHART_DIV']['PARA_DIALOG']['TITLE']' (length=68) 

    var_dump($path3); 
    // PRODUCES:: 
    array (size=2) 
     0 => string '$array['WIDGET_BUILDER_CREATE']['CHART_DIV']['PARA_DIALOG']['CANCEL_BTN']' (length=73) 
     1 => string '$array['WIDGET_BUILDER_CREATE']['CHART_DIV']['SAVE_DIALOG']['CANCEL_BTN']' (length=73) 
+0

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

+0

@ BeetleJuice Большое спасибо за указание на это, но я думаю, вы также должны были обратить внимание на пункты: *** Quick & Dirty *** и ***, если вы чувствуете себя geeky, вы можете просто реорганизовать вложенные циклы на свой собственный и превратить их в более короткий рекурсивный алгоритм ***. И да, это не поддерживает глубоко вложенную структуру, и именно поэтому я упомянул, рекурсивный алгоритм, который OP попросили реализовать .... все же, спасибо ... – Poiz

+0

@ Хиранья Конечно ... Сообщение только что обновлено чтобы включить это ... рекомендуется подумать о внедрении рекурсивного алгоритма, если ваш массив будет глубже, чем 4 уровня .... – Poiz

1

Функция ниже ищет $source массива и возвращает массив со всеми соответствующими путями для значения $target. Если значение не найдено в $source, оно возвращает пустой массив.

function pathFinder($target, array $source, $parentPath=''){ 
    $results=[]; 
    foreach($source as $k => $v){ 
     $path = $parentPath.'/'.$k; //current path 
     //if element is array, recurse and import found results 
     if(is_array($v) && $result=pathFinder($target, $v,$path)){ 
      foreach($result as $r) array_push($results,$r); 
     } 
     //else add element to results if it matches $target 
     elseif($v===$target) $results[]=$path;  
    } 
    return $results; 
} 

Использование:

$target = 'Please enter axis Y name'; 
$foundPaths = pathFinder($target, $array); 

Live demo

+0

он возвращает '/ WIDGET_BUILDER_CREATE/CHART_DIV/PARA_DIALOG/VALIDATION/YAXISNAME', но не как' массив index' – Hiranya

+0

@Hiranya Итак, я сделал для вас трудную часть. Конечно, вы можете сделать все остальное. Просто работайте над строкой '$ path = $ parentPath. '/'. $ K;' для форматирования пути по вашему желанию. Или просто отформатируйте путь, возвращаемый функцией, выполнив 'explode ('/', $ result)', а затем добавив скобки '[]' вокруг каждого результата. Если вы решите использовать мой ответ в качестве основы для своего решения, не забудьте перевернуть и выбрать его. – BeetleJuice

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

  • Нет связанных вопросов^_^