2016-05-13 107 views
3
$array = ["farm"=> 
       [ 
       "horse"=> 
       [ 
        "rabbit"=> 
        [ 
         "fred1"=> "fred1", 
         "fred2"=> "fred2", 
         "fred3"=> "fred3", 
         "fred4"=> "fred4" 
        ], 
       "raccoon"=> 
        ["frida"=> "frida"] 
        ] 
       ] 
    ]; 

我想从创建一个数组,我每个循环:如何从foreach循环创建关联数组?

$keySearch = "o"; 

    function createList($array, $keySearch, $path) { 
     foreach ($array as $key => $item) { 
      $basePath = $path === null ? $key : $path. "/" . $key; 
       if(is_array($item)){ 
        if (stripos($key, $keySearch) !== false){ 
        $a['key'] = $key ; 
        $b['basePath'] = $basePath; 
        $result[] = array_merge_recursive ($a, $b);    
        } 
       createList($item, $keySearch, $basePath); 
       }  
     } 
    print_r($result); 
    } 
    createList($array, $keySearch, ''); 

我的结果是:

Array 
(
    [0] => Array 
     (
      [key] => horse 
      [basePath] => farm/horse 
     ) 

) 
Array 
(
    [0] => Array 
     (
      [key] => raccoon 
      [basePath] => farm/horse/raccoon 
     ) 

) 

什么其实我想到的是:

Array 
    (
     [0] => Array 
      (
       [key] => horse 
       [basePath] => farm/horse 
      ) 
     [1] => Array 
      (
       [key] => raccoon 
       [basePath] => farm/horse/raccoon 
      ) 

    ) 

https://eval.in/571065

+0

什么是您的预期输出之间的差异? – splash58

+0

@ splash58我的输出是两个数组,但我只需要一个数组 – Jarla

+0

什么是$ keySearch? – splash58

回答

1

我改进代码:

function createList($array, $keySearch, $path=null) { 
    $result = []; 
    foreach ($array as $key => $item) { 
     $basePath = $path === null ? $key : $path. "/" . $key; 
      if(is_array($item)){ 
       if (stripos($key, $keySearch) !== false) { 
       $result[] = ['key' => $key, 'basePath' => $basePath];    
       } 
      $result = array_merge($result, createList($item, $keySearch, $basePath)); 
      }  
    } 
return $result; 
} 

$keySearch = 'o'; 
$res = createList($array, $keySearch); 
print_r($res); 

demo

UPD:如果你发现所有的钥匙,不仅是那些指向数组,改变代码,以便:

function createList($array, $keySearch, $path=null) { 
       $result = []; 
    foreach ($array as $key => $item) { 
     $basePath = $path === null ? $key : $path. "/" . $key; 
     if (stripos($key, $keySearch) !== false) 
      $result[] = ['key' => $key, 'basePath' => $basePath];    
     if(is_array($item)) 
      $result = array_merge($result, createList($item, $keySearch, $basePath)); 
    } 
return $result; 
} 

$keySearch = 'fr'; 
$res = createList($array, $keySearch); 
print_r($res); 

demo

+0

这工作得很好! – Jarla

+0

你是什么意思由'点数组'?例如 – Jarla

+1

,如果在数组中有key =>值,它将不会被第一个代码选中,并且将被第2个。但是$ key => [array]将在两种情况下 – splash58

1

递归算法求解:

<?php 

     $array = ["farm"=> 
       [ 
        "horse"=> 
        [ 
         "rabbit"=> 
          [ 
           "fred1"=> "fred1", 
           "fred2"=> "fred2", 
           "fred3"=> "fred3", 
           "fred4"=> "fred4" 
          ], 
         "raccoon"=> 
          ["john"=> "john"] 
        ] 
       ] 
     ]; 


      $jl  = array(); 
      $root = ""; 

      function walkJarLarsData($ar, $search, $base="base-path", $pKey=""){ 
       global $jl, $root; 
       if(!stristr($root, $base)){ 
        $root .= $base; 
       } 

       foreach($ar as $key=>$val){ 
        $pKey  = $pKey?"{$pKey}":""; 
        if (preg_match("#" . preg_quote($search) . "#", $key)) { 
         $jl[] = array(
          "key"  => $key, 
          "basePath" => $root . "/{$pKey}/{$key}", 
         ); 
        } 
        if(is_array($val)){ 
         walkJarLarsData($val, $search, $base, $key);  
        } 
       } 


       return $jl; 
      } 

      var_dump(walkJarLarsData($array, "o")); 
1

您可以使用与添加ref属性相同的函数,并将数组追加到该属性中。

$array = ["farm"=> 
       [ 
       "horse"=> 
       [ 
        "rabbit"=> 
        [ 
         "fred1"=> "fred1", 
         "fred2"=> "fred2", 
         "fred3"=> "fred3", 
         "fred4"=> "fred4" 
        ], 
       "raccoon"=> 
        ["frida"=> "frida"] 
        ] 
       ] 
    ]; 

function createList($array, $keySearch, $path, &$out) { 
    foreach ($array as $key => $item) { 
     $basePath = $path === null ? $key : $path. "/" . $key; 
     if(is_array($item)){ 
      if (stripos($key, $keySearch) !== false){ 
       $a['key'] = $key ; 
       $b['basePath'] = $basePath; 
       $out[] = array_merge_recursive ($a, $b);    
      } 
      createList($item, $keySearch, $basePath, $out); 
     }  
    } 
} 

$keySearch = "o"; 
createList($array, $keySearch, '', $result); 
print_r($result); 

演示:https://eval.in/571224

1

无疑,这是解决方案,您寻找:

<?php 

    $arBase  = array(); 
    $kern  = ""; 

    function arrayRecurse($ar, $search, $mainPath="base-path", $cue=""){ 
     global $arBase, $kern; 
     $kern = !(stristr($kern, $mainPath))? $kern.= $mainPath : $kern; 

     foreach($ar as $key=>$val){ 
      $cue  = $cue?"{$cue}":""; 
      if (preg_match("#" . preg_quote($search) . "#", $key)) { 
       $arBase[] = array(
        "key"  => $key, 
        "basePath" => $kern . "/{$cue}/{$key}", 
       ); 
      } 
      if(is_array($val)){ 
       arrayRecurse($val, $search, $mainPath, $key); 
      } 
     } 

     return $arBase; 
    } 

    var_dump(arrayRecurse($array, "fr"));