2014-03-10 1 views
1

при поиске элемента во вложенном массиве, могу ли я вернуть его индекс вложения 1-го уровня.Как найти элемент в вложенном массиве и получить его индекс вспомогательного массива

<?php 
static $cnt = 0; 
$name = 'victor'; 
$coll = array(
    'dep1' => array(
     'fy' => array('john', 'johnny', 'victor'), 
     'sy' => array('david', 'arthur'), 
     'ty' => array('sam', 'joe', 'victor') 
    ), 
    'dep2' => array(
     'fy' => array('natalie', 'linda', 'molly'), 
     'sy' => array('katie', 'helen', 'sam', 'ravi', 'vipul'), 
     'ty' => array('sharon', 'julia', 'maddy') 
    ) 
); 

function recursive_search(&$v, $k, $search_query){ 
    global $cnt; 
    if($v == $search_query){ 
     /* i want the sub array index to be returned */ 
    } 
} 

?>

т.е. сказать, если i'am поиск 'триумфатора', я хотел бы иметь 'dep1' в качестве возвращаемого значения. Может ли кто-нибудь помочь?

ответ

1

Try:

$name = 'victor'; 
$coll = array(
    'dep1' => array(
     'fy' => array('john', 'johnny', 'victor'), 
     'sy' => array('david', 'arthur'), 
     'ty' => array('sam', 'joe', 'victor') 
    ), 
    'dep2' => array(
     'fy' => array('natalie', 'linda', 'molly'), 
     'sy' => array('katie', 'helen', 'sam', 'ravi', 'vipul'), 
     'ty' => array('sharon', 'julia', 'maddy') 
    ) 
); 

$iter = new RecursiveIteratorIterator(new RecursiveArrayIterator($coll), RecursiveIteratorIterator::SELF_FIRST); 

/* These will be used to keep a record of the 
    current parent element it's accessing the childs of */ 
$parent_index = 0; 
$parent = ''; 
$parent_keys = array_keys($coll); //getting the first level keys like dep1,dep2 
$size = sizeof($parent_keys); 
$flag=0; //to check if value has been found 

foreach ($iter as $k=>$val) { 
    //if dep1 matches, record it until it shifts to dep2 
    if($k === $parent_keys[$parent_index]){ 
     $parent = $k; 
      //making sure the counter is not incremented 
      //more than the number of elements present 
     ($parent_index<$size-1)?$parent_index++:''; 
    } 
    if ($val == $name) { 
     //if the value is found, set flag and break the loop 
     $flag = 1; 
     break; 
    } 
} 

($flag==0)?$parent='':''; //this means the search string could not be found 
echo 'Key = '.$parent; 

Demo

1

Это работает, но я не знаю, если вы с этим согласны ...

<?php 
$name = 'linda'; 
$col1=array ('dep1' => array ('fy' => array (0 => 'john', 1 => 'johnny', 2 => 'victor',), 'sy' => array (0 => 'david', 1 => 'arthur',), 'ty' => array (0 => 'sam', 1 => 'joe', 2 => 'victor',),), 'dep2' => array ('fy' => array (0 => 'natalie', 1 => 'linda', 2 => 'molly',), 'sy' => array (0 => 'katie', 1 => 'helen', 2 => 'sam', 3 => 'ravi', 4 => 'vipul',), 'ty' => array (0 => 'sharon', 1 => 'julia', 2 => 'maddy',),),); 

foreach($col2 as $k=>$arr) 
{ 
    foreach($arr as $k1=>$arr2) 
    { 
     if(in_array($name,$arr2)) 
     { 
      echo $k; 
      break; 
     } 
    } 
} 

OUTPUT :

dept2 

Demo

+0

ваш код работает, вот и все хорошо. но в случае, если мой массив имеет 3 из 4 вложенных уровней, он не будет работать. на самом деле найти решение, которое будет работать на любом уровне вложенности. –

+0

Вам нужно опубликовать весь массив или вы можете найти SO для множества тем по рекурсивному поиску в массивах. –

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