递归搜索返回存在值的所有键

时间:2014-11-19 23:37:03

标签: php arrays multidimensional-array

目前仍然试图让最后一部分工作,希望在值存在的地方返回所有数组键。

测试数据

$testArr = array(
    'id' => '249653315914',
    'title' => 'testing',
    'description' => 'testing',
    'usernames' => array('jake', 'liam', 'john'),
    'masterNames' => array('jake'),
    'data' => array(
        'aliases' => array(
            'jake'
        )
    )
);

方式

recursive_search('jake', $testArr);

function recursive_search($needle, $haystack, $child = false) {
    $values = array();
    foreach($haystack as $key => $value) {
        $current_key = $key;
        if($needle === $value OR (is_array($value) && $children = recursive_search($needle, $value, true) !== false)) {
            if($child) {
                if($needle == $value) {
                    return true;
                }
                echo "children: $child, current_key: $current_key   ";
                return $current_key;
            }
            echo "current_key: $current_key, key: $key <br>";
            $values[] = $current_key;
        }
    }
    if(!empty($values)) {
        return $values;
    }
    return false;
}

输出

current_key: usernames, key: usernames 
current_key: masterNames, key: masterNames 
children: 1, current_key: aliases current_key: data, key: data 
array (size=3)
  0 => string 'usernames' (length=5)
  1 => string 'masterNames' (length=8)
  2 => string 'data' (length=4)

预期

  array(
    'usernames',
    'masterNames',
    'data' => array('aliases')
  )

我在$child部分失去了轨道我觉得,在某个地方,我应该归还一些东西并指定它,但我想我已经看了很长时间并且忽略了显而易见的事情。

任何帮助都很棒。

2 个答案:

答案 0 :(得分:2)

我认为你做错的事情是检查当前的$ value是否是一个数组并对它进行递归搜索,而对它的返回值做任何事情(这应该是数组为false),这里我用过一步一步的方法(至少我是这么想的) 这适用于具有更多分支的#34;

修改

function recursive_search($needle, $haystack) {
        $values = array();
        foreach($haystack as $key => $value) {
            if(is_array($value)) {
              $children = $this->recursive_search($needle, $value);
              if($children !== false){
                  if(!is_bool($children) and !empty($children)){
                    $key = array($key => $children);
                  }
                  $values[] = $key;
               } 
            } else if(strcmp($needle, $value) == 0 ){
                if(is_int($key))
                    return true;
                else
                    $vaues[] = $key;
             } 
    }
    if(!empty($values)) {
        return $values;
    }
    return false;
}

摆脱了数组中的&#34; 0&#34; s,谢谢提示(来自他的回应)

答案 1 :(得分:2)

$testArr = array(
    'id' => '249653315914',
    'title' => 'jake',
    'description' => 'testing',
    'usernames' => array('jake', 'liam', 'john'),
    'masterNames' => array('jake'),
    'data' => array(
        'aliases' => array(
            'jake'
        ),
        'aliases2' => array('level3' => array('jake'))
    )
);

function recursive_search($needle, $haystack) {
   $return = array();
   if (is_array($haystack))
      foreach($haystack as $key => $value)
      {
          if (is_array($value))
          {
             $child = recursive_search($needle, $value); 
             if (is_array($child) && !empty($child))
                $return = array_merge($return, array($key => $child));
             elseif ($child) $return[] = $key;
          }
          elseif ($value === $needle)
             if (is_integer($key))
                return true;
             else
                $return[] = $key;
      }
      elseif ($haystack === $needle)
         return true;

   return $return;
}

输出

Array
(
    [0] => title
    [1] => usernames
    [2] => masterNames
    [data] => Array
        (
            [0] => aliases
            [aliases2] => Array
                (
                    [0] => level3
                )

        )

)

需要进行测试,不保证在所有情况下都能正常运行。此外,在像array('level3' => array('jake'), 'jake')这样的情况下,它不会更深入到level3等等,因为&#39; jake&#39;存在于原始数组中。如果这不是一个理想的行为,请提及。

通过Bankzilla编辑:使用对象

function recursive_search($needle, $haystack) {
    $return = array();
    if (is_array($haystack) || is_object($haystack)) {
        foreach($haystack as $key => $value) {
            if (is_array($value) || is_object($value)) {
                $child = recursive_search($needle, $value); 
                if ((is_array($child) || is_object($child)) && !empty($child)) {
                    $return = array_merge($return, array($key => $child));
                } elseif ($child) {
                    $return[] = $key;
                }
            }
            elseif ($value === $needle) {
                if (is_integer($key)) {
                    return true;
                } else {
                    $return[] = $key;
                }
            }
        }
    } elseif ($haystack === $needle) {
        return true;
    }
    return $return;
}