Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP如何在多维数组中查找值的键_Php_Arrays_Multidimensional Array - Fatal编程技术网

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

PHP如何在多维数组中查找值的键,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我一直在研究这个问题,但是我对PHP的当前函数没有任何结果 我有一个多维数组,如: Array ( [3] => Array ( [16] => 0 [17] => 1 [18] => 2 ) [4] => Array ( [22] => 3 [23] => 4

我一直在研究这个问题,但是我对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). 就像上面的阵列一样


提前感谢。

在看到您特别想要的东西后:

$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
    )
)

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

$matched = [];
foreach($object as $extIndex => $array){
    foreach($array as $intIndex => $value){
        if($value == 3){
            $matched[] = [$extIndex, $intIndex];
        }
    }
}
var_dump($matched);
编辑:$object是问题中描述的对象。

也许这会起作用(不过我还没有尝试过)


findInArray($array,3,[])的形式调用

使用此函数可以避免一次循环

$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);

此函数适用于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

使用一个函数搜索第一个键,然后将属于第一个数组的键作为数组返回,这样您就可以像下面这样遍历值:

<?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。

如果您确定输入数组始终仅为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


我希望它有帮助

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

演示:

如何: 搜索数组以查找值

  • 每次遇到新数组时,我们都需要搜索它
  • 因此,在堆栈ad中记录当前键,然后递归搜索它
  • 如果我们找到了值,那么结束
  • 否则,我们将丢弃堆栈顶部并继续查找
执行该工作的功能:

/**
 *  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
)

我不明白为什么,通过在参数中传递函数
3
,它会给出
数组[4,23]
。如果有一个值“3”,你称之为什么值?因为在数组中,我看到的唯一值是
[22]=>3
,所以它的键是
22
,它的键是
4
。所以它将输出
[4,22]
,而不像您所说的
[4,23]
。或者我错了?此外,我想如果你在搜索3,它必须返回(4,22)。是的,@Giuserv..@ArdaTahsinAyar,所以我上面的答案符合你的要求,看起来也一样,谢谢你的快速帮助@GiuServThanks,但它给出了数组中的所有键,我只需要我想要的值。它对数组只有1个值,如果3对数组多次出现,它将只返回第一个匹配现在它可以工作了,但现在你做了一个新的循环,还做了一个额外的操作来取消数组中的值(我还认为,通过这种方式,您也在编辑原始对象)@ArdaTahsinAyar很好,您可以将问题标记为已回答。
string(6) "Found:"
bool(true)

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