PHP数组过滤器(就像SELECT所有FROM ARRAY,其中$ ARRAY1中的key1和$ ARRAY2中的key2)

时间:2015-09-14 12:03:03

标签: php arrays

我有一个像:

这样的数组
Array
(
    [0] => Array
        (
            [questionid] => 21790
            [name] => "________ would anyone hurt my poor cat?"
            [userid] => 2
            [firstname] => Admin
            [category] => 69080
        )

    [1] => Array
        (
            [questionid] => 21770
            [name] => Choose a suitable meaning of ‘bright’
            [userid] => 2
            [firstname] => Admin
            [category] => 69053
        )

    [2] => Array
        (
            [questionid] => 21769
            [name] => Choose the correct English word for: سمجھنا
            [userid] => 2
            [firstname] => Admin
            [category] => 69053
        )
    ...
    ...
    ...
    ...
    ...

)

我想在此数组中搜索两个值questioniduserid,这些值位于以下数组中:

$questionids = array(23434, 33232, 33321);
$userids = array(2, 6, 33, 67, 88, 22, 43);

简而言之,我希望主数组中的每个元素都有两个值(questionid和userid)位于数组$questionids$userids中。

我尝试了很多解决方案,但还没有找到任何最佳解决方案。任何帮助将不胜感激。

来自评论

我试过了:

function search( $array, $key, $value ) {
  $results = array();
  if ( is_array( $array ) ) {
    if ( isset( $array[ $key ] ) && $array[ $key ] == $value ) {
      $results[] = $array;
    }
    foreach ( $array as $subarray ) {
      $results = array_merge( $results, search( $subarray, $key, $value ) );
    }
  }

  return $results;
}

但上述解决方案的问题在于它需要单个键值对,并且我有多个键值对要查找(在不同的数组中)。

2 个答案:

答案 0 :(得分:4)

只需查看函数array_filter,它应该是您的最佳选择。 http://php.net/manual/en/function.array-filter.php

   $result = array_filter($array, "test_match", ARRAY_FILTER_USE_BOTH);

   function test_match($key, $value){
      $questionids = array(23434, 33232, 33321);
      $userids = array(2, 6, 33, 67, 88, 22, 43);

      return 
        in_array($value["userid"], $userids) && //user match?
        in_array($value["questionid"], $questionids); //question match?
   }  

$result现在只包含符合条件的元素。

请注意,我已阅读您的说明

  

简而言之,我希望主数组中的每个元素都有两个值(questionid和userid)位于数组$ questionids和$ userids中。

作为and条件。如果要么匹配,要么匹配,简单返回

return 
  in_array($value["userid"], $userids) || //user match?
  in_array($value["questionid"], $questionids); //question match?

如果要将参数$userids$questionids作为参数传递,可以将它们包装在执行回调的对象中:

请参阅此处的文档:https://secure.php.net/manual/en/language.types.callable.php每个回调都支持数组(实例/方法名称),或者仅支持第一个示例中的方法名称。

class DataClosure{
      private $qids;
      private $uids;

      function __construct($qids, $uids){
         $this->uids = $uids;
         $this->qids = $qids;
      } 

      function test_match($key, $value){
        return 
          in_array($value["userid"], $this->uids) && //user match?
          in_array($value["questionid"], $this->qids); //question match?
     }  
}

代码

$questionids = array(23434, 33232, 33321);
$userids = array(2, 6, 33, 67, 88, 22, 43);


$result = array_filter(
   $array, 
   array(
     new DataClosure($questionids, $userids),
     "test_match"
   ), 
   ARRAY_FILTER_USE_BOTH);

答案 1 :(得分:-2)

$question = [];
$userid = [];

foreach($arr as $item){
     array_push($question, $item->questionid);
      array_push($userid , $item->userid);
 }
var_dump($question );
var_dump($userid);

更新:导航到您的阵列并获取您想要的值! 简单如abc!