PHP如何在多维数组中查找值的键

时间:2016-11-08 13:40:49

标签: php arrays multidimensional-array

我一直在研究这个问题,但我当前没有PHP的当前功能。

我有一个多维数组,如:

Array
(
    [3] => Array
        (
            [16] => 0
            [17] => 1
            [18] => 2
        )

    [4] => Array
        (
            [22] => 3
            [23] => 4
        )

    [5] => Array
        (
            [1] => 5
        )

)

如果数组的第一个键是静态的,那么很容易修复,但是 所有的键都是动态数据。 (3,4,5等......)我喜欢有一个找到值的键的函数。

myFunction($myArray, 3) // 3 = my value.

如果有值" 3",我希望函数给我关键字。 (4,22)。就像顶部的数组一样。

提前致谢。

8 个答案:

答案 0 :(得分:1)

看到你特别想要的东西后:

$array_data = [
  3 => [
    16 => 0,
    17 => 3,
    18 => 2],
  4 => [
    22 => 3,
    23 => 4],
  5 => [
    1 => 5]
];

function findKeysFromValue($search, $array){

    foreach($array as $key => $value){
        $b = [];
        foreach($value as $k => $v){
            if($v != $search){
                unset($array[$key][$k]);
            } else {
                $b[] = $k;
            }
        }
        $array[$key] = $b;
    }

    return array_filter($array,'count');
}

print_r(findKeysFromValue(3, $array_data));

输出如下:

Array(
  [3] => Array(
      [0] => 17
    )
  [4] => Array(
      [0] => 22
    )
)

答案 1 :(得分:1)

如果您确定输入数组始终只是2D,那么这是解决方案。

$test = [
  3 => [
    16 => 0,
    17 => 1,
    18 => 2],
  4 => [
    22 => 3,
    23 => 4],
  5 => [
    1 => 5]
];

function myFunction($array, $value){
    foreach($array as $k => $a){
        if(in_array($value, $a)){
            return ([$k,array_keys($a,$value)]);
        }
    }
}
var_dump(myFunction($test, 3));

这将输出:

array(2) { [0]=> int(4) [1]=> array(1) { [0]=> int(22) } }

请注意返回数组中的第二个值本身就是一个arrray,因为数组中可能存在多个3个。

我希望它有所帮助

答案 2 :(得分:0)

假设您想要一个包含数组索引的键数组,其中包含搜索值(3),以及该数组中3值的索引,这应该有效:

$matched = [];
foreach($object as $extIndex => $array){
    foreach($array as $intIndex => $value){
        if($value == 3){
            $matched[] = [$extIndex, $intIndex];
        }
    }
}
var_dump($matched);

编辑:$ object是问题中描述的对象。

答案 3 :(得分:0)

也许这会奏效(虽然我还没试过)。

function findInArray($array, $search, $parentPath) {
      foreach ($array as $key => $value) {                
            $currentPath = array_merge($parentPath, $key);
            if (!is_array($value) && $value === $search) {
                return $currentPath;
            } else if (is_array($value)) {
                $res = findInArray($value, $search, $currentPath);
                if ($res !== null) {
                    return $res;
                }
            }
      }
      return null;
}

请致电findInArray($array, 3, [])

答案 4 :(得分:0)

此功能适用于2维数组:

function findKey( $arr, $arrValue ) {
    foreach ( $arr as $key => $value ) {
        foreach ( $value as $subKey => $subValue ) {
            if ( $arrValue == $subValue ) {
                return $subKey;
            }
        }
    }

    return - 1;
}

$mdArray = array(
    12 => array(
        3 => 4,
        4 => 8,
        7 => 9
    ),
    23 => array(
        5  => 5,
        8  => 12,
        11 => 18
    ),
);

echo findKey( $mdArray, 4 ); //3
echo findKey( $mdArray, 5 ); //5
echo findKey( $mdArray, 8 ); //4
echo findKey( $mdArray, 12 ); //8

答案 5 :(得分:0)

如何搜索第一个键的函数然后将属于第一个数组的键作为数组返回,以便您可以遍历这样的值:

<?php

    function FindTheKeys($myArray, $myKey)
    {
            foreach ($myArray as $firstkeys => $firstvalues)
            {
                    if ($firstkeys == $myKey)
                    {
                            return array_keys($firstvalues);
                    }
            }
    }

    $myarr = Array
    (
            3 => Array
            (
                    16 => 0,
                    17 => 1,
                    18 => 2
            ),

            4 => Array
            (
                    22 => 3,
                    23 => 4
            ),

            5 => Array
            (
                    1 => 5
            )

    );

    $foundkeys = FindTheKeys($myarr, 3);

    print_r($foundkeys);

?>

以上将在数组$ foundkeys中返回16,17,18。

答案 6 :(得分:0)

搜索任何数组深度并返回第一个值匹配的递归函数怎么样。

示范:https://eval.in/674271

如何:    搜索数组以查找值。

  • 每次遇到新阵列时,我们都需要进行搜索。
  • 所以,在堆叠广告中记录当前密钥,然后递归搜索它。
  • 如果我们找到该值,则结束。
  • 否则,我们扔掉堆栈的顶部并继续寻找。

完成工作的功能:

/**
 *  This will recurse until it finds the value.
 *  stop on first match 
 *
 *  @param array $haystack - where to look 
 *  @param mixed $needle   - what to look for
 *  @param array $keyPath  - reference to result array that will store the path   
 *
 *  @return  boolean $found
 */
function findKeys(array $haystack, $needle, &$keyPath)
{
     $found = false;

     foreach ($haystack as $key => $value) {

        if (is_array($value)) { // record current key and recurse 
            array_push($keyPath, $key);
            $found = findKeys($value, $needle, $keyPath);   
            if ($found) {
                return $found;
            }             
            array_pop($keyPath);


        } else {
            $found = $value === $needle;
            if ($found) {
                array_push($keyPath, $key);
                break;
            }
        } 
     }

     return $found;   
}

运行它:

$path = array();

$found = findKeys($src, 42, $path);

示例输出:

string(6) "Found:"
bool(true)

Path
Array
(
    [0] => 4
    [1] => 24
    [2] => 126
)

答案 7 :(得分:-1)

使用此功能可以避免一次循环。

$matched = [];
foreach($object as $extIndex => $array){
    //Look for value 3 in the array until no value is found
    while (false !== $key = array_search(3, $array)) {
        $matched[] = [$extIndex, $key];
        //Remove the value already found
        unset($array[$key]);
    }

}
print_r($matched);