PHP如何在多维数组中查找值的键
我一直在研究这个问题,但是我对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
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
)