PHP多维数组按值搜索

PHP多维数组按值搜索,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我有一个数组,我想在其中搜索uid,并获取数组的键 例子 假设我们有以下二维数组: $userdb = array( array( 'uid' => '100', 'name' => 'Sandra Shush', 'pic_square' => 'urlof100' ), array( 'uid' => '5465', 'name' => 'Stefanie M

我有一个数组,我想在其中搜索
uid
,并获取数组的键

例子 假设我们有以下二维数组:

$userdb = array(
    array(
        'uid' => '100',
        'name' => 'Sandra Shush',
        'pic_square' => 'urlof100'
    ),
    array(
        'uid' => '5465',
        'name' => 'Stefanie Mcmohn',
        'pic_square' => 'urlof100'
    ),
    array(
        'uid' => '40489',
        'name' => 'Michael',
        'pic_square' => 'urlof40489'
    )
);
函数调用
search\u by\u uid(100)
(第一个用户的uid)应返回
0

函数调用
search\u by\u uid(40489)
应返回
2

我试着做循环,但我想要一个执行速度更快的代码

function searchForId($id, $array) {
   foreach ($array as $key => $val) {
       if ($val['uid'] === $id) {
           return $key;
       }
   }
   return null;
}
这会奏效的。你应该这样称呼它:

$id = searchForId('100', $userdb);
重要的是要知道,如果您使用的是
==
运算符,比较的类型必须完全相同,在本例中,您必须搜索
字符串
,或者只使用
=

基于答案。在PHP的更高版本(
=5.5.0
)中,您可以使用一个行程序

$key = array_search('100', array_column($userdb, 'uid'));
以下是文档:

这会奏效的。你应该这样称呼它:

$id = searchForId('100', $userdb);
重要的是要知道,如果您使用的是
==
运算符,比较的类型必须完全相同,在本例中,您必须搜索
字符串
,或者只使用
=

基于答案。在PHP的更高版本(
=5.5.0
)中,您可以使用一个行程序

$key = array_search('100', array_column($userdb, 'uid'));

这里是文档:。

我知道这已经得到了回答,但我使用了它,并在代码中对其进行了更多的扩展,这样您就不会只通过uid进行搜索。我只想把它分享给其他可能需要该功能的人

这是我的例子,请记住这是我的第一个答案。我取出了param数组,因为我只需要搜索一个特定的数组,但您可以轻松地将其添加进去。我想本质上不仅仅通过uid进行搜索

此外,在我的情况下,可能有多个键返回作为搜索结果的其他领域,可能不是唯一的

 /**
     * @param array multidimensional 
     * @param string value to search for, ie a specific field name like name_first
     * @param string associative key to find it in, ie field_name
     * 
     * @return array keys.
     */
     function search_revisions($dataArray, $search_value, $key_to_search) {
        // This function will search the revisions for a certain value
        // related to the associative key you are looking for.
        $keys = array();
        foreach ($dataArray as $key => $cur_value) {
            if ($cur_value[$key_to_search] == $search_value) {
                $keys[] = $key;
            }
        }
        return $keys;
    }
后来,我写了这篇文章,以便搜索另一个值和关联键。因此,我的第一个示例允许您在任何特定的关联键中搜索一个值,并返回所有匹配项

第二个示例显示了在某个关联键(名字)中找到一个值('Taylor')和在另一个关联键(使用)中找到另一个值(true),并返回所有匹配项(使用名字为'Taylor'的人的键)

功能的使用

$data = array(
    array(
        'cust_group' => 6,
        'price' => 13.21,
        'price_qty' => 5
    ),
    array(
        'cust_group' => 8,
        'price' => 15.25,
        'price_qty' => 4
    ),
    array(
        'cust_group' => 8,
        'price' => 12.75,
        'price_qty' => 10
    )
);

$findKey = search_revisions($data,'8', 'cust_group', '10', 'price_qty');
print_r($findKey);
Array ( [0] => 2 ) 
结果

$data = array(
    array(
        'cust_group' => 6,
        'price' => 13.21,
        'price_qty' => 5
    ),
    array(
        'cust_group' => 8,
        'price' => 15.25,
        'price_qty' => 4
    ),
    array(
        'cust_group' => 8,
        'price' => 12.75,
        'price_qty' => 10
    )
);

$findKey = search_revisions($data,'8', 'cust_group', '10', 'price_qty');
print_r($findKey);
Array ( [0] => 2 ) 

我知道这个问题已经得到了回答,但我使用了这个问题,并在代码中对其进行了更多的扩展,这样您就不会只通过uid进行搜索。我只想把它分享给其他可能需要该功能的人

这是我的例子,请记住这是我的第一个答案。我取出了param数组,因为我只需要搜索一个特定的数组,但您可以轻松地将其添加进去。我想本质上不仅仅通过uid进行搜索

此外,在我的情况下,可能有多个键返回作为搜索结果的其他领域,可能不是唯一的

 /**
     * @param array multidimensional 
     * @param string value to search for, ie a specific field name like name_first
     * @param string associative key to find it in, ie field_name
     * 
     * @return array keys.
     */
     function search_revisions($dataArray, $search_value, $key_to_search) {
        // This function will search the revisions for a certain value
        // related to the associative key you are looking for.
        $keys = array();
        foreach ($dataArray as $key => $cur_value) {
            if ($cur_value[$key_to_search] == $search_value) {
                $keys[] = $key;
            }
        }
        return $keys;
    }
后来,我写了这篇文章,以便搜索另一个值和关联键。因此,我的第一个示例允许您在任何特定的关联键中搜索一个值,并返回所有匹配项

第二个示例显示了在某个关联键(名字)中找到一个值('Taylor')和在另一个关联键(使用)中找到另一个值(true),并返回所有匹配项(使用名字为'Taylor'的人的键)

功能的使用

$data = array(
    array(
        'cust_group' => 6,
        'price' => 13.21,
        'price_qty' => 5
    ),
    array(
        'cust_group' => 8,
        'price' => 15.25,
        'price_qty' => 4
    ),
    array(
        'cust_group' => 8,
        'price' => 12.75,
        'price_qty' => 10
    )
);

$findKey = search_revisions($data,'8', 'cust_group', '10', 'price_qty');
print_r($findKey);
Array ( [0] => 2 ) 
结果

$data = array(
    array(
        'cust_group' => 6,
        'price' => 13.21,
        'price_qty' => 5
    ),
    array(
        'cust_group' => 8,
        'price' => 15.25,
        'price_qty' => 4
    ),
    array(
        'cust_group' => 8,
        'price' => 12.75,
        'price_qty' => 10
    )
);

$findKey = search_revisions($data,'8', 'cust_group', '10', 'price_qty');
print_r($findKey);
Array ( [0] => 2 ) 
在Jakub的基础上,这里有一个更通用的搜索,它将允许指定密钥(不仅仅是uid):

用法:
$results=searcharray('searchvalue',searchkey,$array)

在Jakub的基础上,这里有一个更通用的搜索,允许指定密钥(不仅仅是uid):


用法:
$results=searcharray('searchvalue',searchkey,$array)

我不得不使用un函数来查找数组中的每个元素。因此,我修改了Jakub Truneček的函数,如下所示:

function search_in_array_r($needle, $array) {
    $found = array();
    foreach ($array as $key => $val) {
        if ($val[1] == $needle) {
            array_push($found, $val[1]);
        }
    }
    if (count($found) != 0)
        return $found;
    else
        return null;
}

我必须使用un函数来查找数组中的每个元素。因此,我修改了Jakub Truneček的函数,如下所示:

function search_in_array_r($needle, $array) {
    $found = array();
    foreach ($array as $key => $val) {
        if ($val[1] == $needle) {
            array_push($found, $val[1]);
        }
    }
    if (count($found) != 0)
        return $found;
    else
        return null;
}

我修改了下面的一个示例描述函数。函数
searchItemsByKey
从多维数组(N个级别)按$key返回所有值。也许,它会对某些人有用。例如:

 $arr = array(
     'XXX'=>array(
               'YYY'=> array(
                    'AAA'=> array(
                          'keyN' =>'value1'
                   )
               ),
              'ZZZ'=> array(
                    'BBB'=> array(
                          'keyN' => 'value2'
                   )
               )
              //.....
           )
);


$result = searchItemsByKey($arr,'keyN');

print '<pre>';
print_r($result);
print '<pre>';
// OUTPUT
Array
(
  [0] => value1
  [1] => value2
)

我修改了下面的一个示例描述函数。函数
searchItemsByKey
从多维数组(N个级别)按$key返回所有值。也许,它会对某些人有用。例如:

 $arr = array(
     'XXX'=>array(
               'YYY'=> array(
                    'AAA'=> array(
                          'keyN' =>'value1'
                   )
               ),
              'ZZZ'=> array(
                    'BBB'=> array(
                          'keyN' => 'value2'
                   )
               )
              //.....
           )
);


$result = searchItemsByKey($arr,'keyN');

print '<pre>';
print_r($result);
print '<pre>';
// OUTPUT
Array
(
  [0] => value1
  [1] => value2
)

你可以使用这个功能;


您可以使用此功能;

如果您正在使用(PHP5>=5.5.0),您不必编写自己的函数来完成此操作,只需编写这一行就可以了

如果只需要一个结果:

/**
 * searches a simple as well as multi dimension array
 * @param type $needle
 * @param type $haystack
 * @return boolean
 */
public static function in_array_multi($needle, $haystack){
    $needle = trim($needle);
    if(!is_array($haystack))
        return False;

    foreach($haystack as $key=>$value){
        if(is_array($value)){
            if(self::in_array_multi($needle, $value))
                return True;
            else
               self::in_array_multi($needle, $value);
        }
        else
        if(trim($value) === trim($needle)){//visibility fix//
            error_log("$value === $needle setting visibility to 1 hidden");
            return True;
        }
    }

    return False;
}
对于多个结果

function searchArrayKeyVal($sKey, $id, $array) {
   foreach ($array as $key => $val) {
       if ($val[$sKey] == $id) {
           return $key;
       }
   }
   return false;
}
如果您有注释中指出的关联数组,您可以使用:

    // Array Data Of Users
$userdb = array (
    array ('uid' => '100','name' => 'Sandra Shush','url' => 'urlof100' ),
    array ('uid' => '5465','name' => 'Stefanie Mcmohn','url' => 'urlof100' ),
    array ('uid' => '40489','name' => 'Michael','url' => 'urlof40489' ),
);

// Obtain The Key Of The Array
$arrayKey = searchArrayKeyVal("uid", '100', $userdb);
if ($arrayKey!==false) {
    echo "Search Result: ", $userdb[$arrayKey]['name'];
} else {
    echo "Search Result can not be found";
}
如果您使用的是PHP<5.5.0,那么您可以使用,谢谢ramsey

更新:我已经做了一些简单的基准测试,多结果表单似乎是最快的一个,甚至比Jakub自定义函数还要快

如果您正在使用(PHP5>=5.5.0),则不必编写自己的函数来完成此操作,只需编写这一行即可

for( $i =0; $i < sizeof($allUsers); $i++)
    {   
    $NEEDLE1='firstname';
    $NEEDLE2='emailAddress';
    $sterm='Tofind';
     if(isset($allUsers[$i][$NEEDLE1]) && isset($allUsers[$i][$NEEDLE2])
        {
            $Fname= $allUsers[$i][$NEEDLE1];
            $Lname= $allUsers[$i][$NEEDLE2];

            $pos1 = stripos($Fname, $sterm);
            $pos2=stripos($Lname, $sterm);//not case sensitive 

            if($pos1 !== false ||$pos2 !== false)
            {$resultsMatched[] =$allUsers[$i];}
            else
            {   continue;}              
        }

}
Print_r($resultsMatched); //will give array for matched values even partially matched
如果只需要一个结果:

/**
 * searches a simple as well as multi dimension array
 * @param type $needle
 * @param type $haystack
 * @return boolean
 */
public static function in_array_multi($needle, $haystack){
    $needle = trim($needle);
    if(!is_array($haystack))
        return False;

    foreach($haystack as $key=>$value){
        if(is_array($value)){
            if(self::in_array_multi($needle, $value))
                return True;
            else
               self::in_array_multi($needle, $value);
        }
        else
        if(trim($value) === trim($needle)){//visibility fix//
            error_log("$value === $needle setting visibility to 1 hidden");
            return True;
        }
    }

    return False;
}
对于多个结果

function searchArrayKeyVal($sKey, $id, $array) {
   foreach ($array as $key => $val) {
       if ($val[$sKey] == $id) {
           return $key;
       }
   }
   return false;
}
如果您有注释中指出的关联数组,您可以使用:

    // Array Data Of Users
$userdb = array (
    array ('uid' => '100','name' => 'Sandra Shush','url' => 'urlof100' ),
    array ('uid' => '5465','name' => 'Stefanie Mcmohn','url' => 'urlof100' ),
    array ('uid' => '40489','name' => 'Michael','url' => 'urlof40489' ),
);

// Obtain The Key Of The Array
$arrayKey = searchArrayKeyVal("uid", '100', $userdb);
if ($arrayKey!==false) {
    echo "Search Result: ", $userdb[$arrayKey]['name'];
} else {
    echo "Search Result can not be found";
}
如果您使用的是PHP<5.5.0,那么您可以使用,谢谢ramsey


更新:我已经做了一些简单的基准测试,多结果表单似乎是最快的一个,甚至比Jakub自定义函数还要快

尽管这是一个古老的问题,并且有一个公认的答案,但我还是建议使用c
for( $i =0; $i < sizeof($allUsers); $i++)
    {   
    $NEEDLE1='firstname';
    $NEEDLE2='emailAddress';
    $sterm='Tofind';
     if(isset($allUsers[$i][$NEEDLE1]) && isset($allUsers[$i][$NEEDLE2])
        {
            $Fname= $allUsers[$i][$NEEDLE1];
            $Lname= $allUsers[$i][$NEEDLE2];

            $pos1 = stripos($Fname, $sterm);
            $pos2=stripos($Lname, $sterm);//not case sensitive 

            if($pos1 !== false ||$pos2 !== false)
            {$resultsMatched[] =$allUsers[$i];}
            else
            {   continue;}              
        }

}
Print_r($resultsMatched); //will give array for matched values even partially matched
$pic_square = $userdb[array_search($uid,array_column($userdb, 'uid'))]['pic_square'];
$a = [
     [
       "_id" => "5a96933414d48831a41901f2",
       "discount_amount" => 3.29,
       "discount_id" => "5a92656a14d488570c2c44a2",
     ],
     [
       "_id" => "5a9790fd14d48879cf16a9e8",
       "discount_amount" => 4.53,
       "discount_id" => "5a9265b914d488548513b122",
     ],
     [
       "_id" => "5a98083614d488191304b6c3",
       "discount_amount" => 15.24,
       "discount_id" => "5a92806a14d48858ff5c2ec3",
     ],
     [
       "_id" => "5a982a4914d48824721eafe3",
       "discount_amount" => 45.74,
       "discount_id" => "5a928ce414d488609e73b443",
     ],
    [
       "_id" => "5a982a4914d48824721eafe55",
       "discount_amount" => 10.26,
       "discount_id" => "5a928ce414d488609e73b443",
     ],
   ];
function searchForId($id, $array) {
    $did=0;
    $dia=0;
   foreach ($array as $key => $val) {
       if ($val['discount_id'] === $id) {
           $dia +=$val['discount_amount'];
           $did++;
       }
   }
    if($dia != '') {
        echo $dia;
        var_dump($did);
    }
   return null;
};
print_r(searchForId('5a928ce414d488609e73b443',$a));
if( ! function_exists('arraySearchMulti')){
function arraySearchMulti($search,$key,$array,$returnKey=false)
{
    foreach ($array as $k => $val) {
        if (isset($val[$key])) {
            if ((string)$val[$key] == (string)$search) {
                return ($returnKey ? $k : $val);
            }
        }else{
            return (is_array($val) ? arraySearchMulti($search,$key,$val,$returnKey) : null);
        }
    }
    return null;
}}
$search_value = '5465';
$search_key   = 'uid';
$user = array_search($search_value, array_column($userdb, $search_key));

print_r($userdb[$user]);
$find_by_uid = '100';
$is_in_array = array_reduce($userdb, function($carry, $user) use ($find_by_uid){
    return $carry ? $carry : $user['uid'] === $find_by_uid;
}); 
// Returns true
$records = array(
            array(
                'id' => 2135,
                'first_name' => 'John',
                'last_name' => 'Doe',
            ),
            array(
                'id' => 3245,
                'first_name' => 'Sally',
                'last_name' => 'Smith',
            ),
            array(
                'id' => 5342,
                'first_name' => 'Jane',
                'last_name' => 'Jones',
            ),
            array(
                'id' => 5623,
                'first_name' => 'Peter',
                'last_name' => 'Doe',
            )
            );


            function search_user_by_name($name, $array) {
                             foreach ($array as $keys) {
                                 foreach ($keys as $key => $_user_record) {
                                     if ($_user_record == $name) {
                                         return [$key => $_user_record];//Return and array of user
                                     }
                                 }
                             }
                             return null;
                        }
$results = search_user_by_name('John', $records);
         print_r($results);