在多维数组上搜索值然后显示结果

I'm trying to retrieve the values on multidimensional arrays using a search like function.

$rows = array(
    array(
        'Name'=>'City of God',
        'Year'=>'2002',
        'Rating'=>'10'
    ),
    array(
        'Name'=>'The Great Escape',
        'Year'=>'1963',
        'Rating'=>'9'
    ),
    array(
        'Name'=>'Dune',
        'Year'=>'1984',
        'Rating'=>'6'
    ),
    array(
        'Name'=>'Superbabies: Baby Geniuses 2',
        'Year'=>'2004',
        'Rating'=>'1'
    )
);

So for example, if you want to search the array with a value of Name with 'City of God' and Year with '1963' the expected output should be like this

$rows = array(
    array(
        'Name'=>'City of God',
        'Year'=>'2002',
        'Rating'=>'10'
    ),
    array(
        'Name'=>'The Great Escape',
        'Year'=>'1963',
        'Rating'=>'9'
    ),
);

Currently, the function I am using is this

function multiSearch(array $array, array $pairs)
{
    $found = array();
    foreach ($array as $aKey => $aVal) {
        $coincidences = 0;
        foreach ($pairs as $pKey => $pVal) {
            if (array_key_exists($pKey, $aVal) && $aVal[$pKey] == $pVal) {
                $coincidences++;
            }
        }

        if ($coincidences == count($pairs)) {
            $found[$aKey] = $aVal;
        }
    }

    return $found;
} 

However, using this function only capable of retrieving data of the same array key. So for example if I search the value of Name of 'City of God'

$x = multiSearch($rows, array('Name' => 'City of God') 

This will display the correct output like this

$rows = array(
    array(
        'Name'=>'City of God',
        'Year'=>'2002',
        'Rating'=>'10'
    ),
);

Unfortunately, if you try to use, 'Name' => 'City of God' and 'Year' => '1963' It will not display any output. I'm stuck on figuring out on displaying the correct output, any ideas would be appreciated

Try this :

$datas = array(
    array(
        'Name'=>'City of God',
        'Year'=>'2002',
        'Rating'=>'10'
    ),
    array(
        'Name'=>'The Great Escape',
        'Year'=>'1963',
        'Rating'=>'9'
    ),
    array(
        'Name'=>'Dune',
        'Year'=>'1984',
        'Rating'=>'6'
    ),
    array(
        'Name'=>'Superbabies: Baby Geniuses 2',
        'Year'=>'2004',
        'Rating'=>'1'
    )
);

$search = array(
    'Name' => 'Dune',
    'Year' => '2004'
);

$output = array();
foreach ($datas as $key1 => $row) {
    foreach ($row as $key2 => $value) {
        if($search[$key2] == $value) {
        // if(stristr($value, $search[$key2]) !== FALSE) {  // if you want to search
            $output[] = $datas[$key1];
            break;
        }
    }
}

echo "<pre>"; print_r($output); exit;

Output:

Array
(
    [0] => Array
        (
            [Name] => Dune
            [Year] => 1984
            [Rating] => 6
        )

    [1] => Array
        (
            [Name] => Superbabies: Baby Geniuses 2
            [Year] => 2004
            [Rating] => 1
        )

)

try this it is reffered from How can I check if an array contains a specific value in php?

$array = array('kitchen', 'bedroom', 'living_room', 'dining_room');

if (in_array('kitchen', $array)) {
    echo 'this array contains kitchen';
}

what about a recursive call?

function recursiveInArray ($needle, $array) {
    $status = false;
    foreach($array as $value) {
        if(is_array($value)) {
            recursiveInArray($needle, $value);
        } else {
            $status = ($needle == $value);
        }
    }
    return $status;
}

i know its abstract, but should help you working with multi dimensional searching

If you need OR, as you mentioned in your question, you then need to see if at least one coincidence happened:

if ($coincidences > 0) {
   $found[$aKey] = $aVal;
}

This way, both entries:

$rows = array(
   array(
      'Name'=>'City of God',
      'Year'=>'2002',
      'Rating'=>'10'
   ),
   array(
     'Name'=>'The Great Escape',
     'Year'=>'1963',
     'Rating'=>'9'
   ),
);

will be matched.

Modify the search function to this - works for both the cases mentioned:

function multiSearch($rows, $value) {
  $newArr = array();
  foreach ($rows as $row) {
    foreach ($value as $key => $val) {
      if (isset($row[$key]) && $row[$key] == $val) {
        $newArr[] = $row;
      }
    }
  }
  return $newArr;
}

Calling with one or two values produces the required output -

$x = multiSearch($rows, array('Name' => 'City of God')); 

$x = multiSearch($rows, array('Name' => 'City of God', 'Year' => '1963'));

//returns $rows containing this pair

Take a look on my suggestion

function search ($storage, $criteria)
{
    return array_filter(
       $storage,
       function ($row) use ($criteria) {
           foreach ($criteria as $key => $value) {
               if ($row[$key] === $value) {
                   return true;
               }
           } 
       }
    );
}

$result = search($datas, $search);

/**
 * $result = [
 *    2 => [
 *       'Name'   => 'Dune'
 *       'Year'   => '1984'
 *       'Rating' => '6'
 *    ],
 *    3 => [
 *       'Name'   => 'Superbabies: Baby Geniuses 2'
 *       'Year'   => '2004'
 *       'Rating' => '1'
 *    ]
 *  ];
 */