PHP在数组中搜索多个键/值对

时间:2012-12-17 22:46:45

标签: php arrays multidimensional-array

我有一个数组列表(对于这个例子,我使用的是手机)。我希望能够搜索多个键/值对并返回它的父数组索引。

例如,这是我的数组:

// $list_of_phones (array)
Array
(
    [0] => Array
        (
            [Manufacturer] => Apple
            [Model] => iPhone 3G 8GB
            [Carrier] => AT&T
        )

    [1] => Array
        (
            [Manufacturer] => Motorola
            [Model] => Droid X2
            [Carrier] => Verizon
        )
)

我希望能够做以下事情:

// This is not a real function, just used for example purposes
$phone_id = multi_array_search( array('Manufacturer' => 'Motorola', 'Model' => 'Droid X2'), $list_of_phones );

// $phone_id should return '1', as this is the index of the result.

关于我如何或应该如何做的任何想法或建议?

6 个答案:

答案 0 :(得分:15)

也许这会很有用:

  /**
   * Multi-array search
   *
   * @param array $array
   * @param array $search
   * @return array
   */
  function multi_array_search($array, $search)
  {

    // Create the result array
    $result = array();

    // Iterate over each array element
    foreach ($array as $key => $value)
    {

      // Iterate over each search condition
      foreach ($search as $k => $v)
      {

        // If the array element does not meet the search condition then continue to the next element
        if (!isset($value[$k]) || $value[$k] != $v)
        {
          continue 2;
        }

      }

      // Add the array element's key to the result array
      $result[] = $key;

    }

    // Return the result array
    return $result;

  }

  // Output the result
  print_r(multi_array_search($list_of_phones, array()));

  // Array ( [0] => 0 [1] => 1 )

  // Output the result
  print_r(multi_array_search($list_of_phones, array('Manufacturer' => 'Apple')));

  // Array ( [0] => 0 )

  // Output the result
  print_r(multi_array_search($list_of_phones, array('Manufacturer' => 'Apple', 'Model' => 'iPhone 6')));

  // Array ( )

如输出所示,此函数将返回包含符合所有搜索条件的元素的所有键的数组。

答案 1 :(得分:4)

您可以使用array_intersect_key和array_intersect以及array_search

检查array_intersect_key php manual以获取具有匹配键的项目数组

如果项目具有匹配值

,则

array_intesect php manual获取数组

你可以使用$array[key]

获取数组中键的值

使用array_search $key = array_search('green', $array);

获取数组中的键值

php.net/manual/en/function.array-search.php

答案 2 :(得分:1)

我通过添加对不同比较运算符的支持来扩展@MichaelRushton的代码:

var state = $("#state").text();
var now = new Date();
var startDate = $("#startDate").val();
var endDate = $("#endDate").val();
var sdate=Number(startDate);
var edate=Number(endDate);
var empName = $("#searchEmpName").val();
alert(edate+","+sdate);

if (edate < sdate){
  // show error msg
}

答案 3 :(得分:1)

这与@Boolean_Type相同,但增强了一点以简化操作。

$keys = multi_array_search($phonesList, array(
    'Manufacturer' => 'Motorola',
    'Cost >'       => '130000',
));   

这样,您可以像这样搜索:

array(1, 25, 33)

如果找到,你将拥有像这样的索引数组:df <- data.frame(age.band = c("0-5","5-10"), beg.code = c("A1","B1"), end.code=c("A5","B3"),value = c(10,5)) age.band beg.code end.code value 0-5 A1 A5 10 5-10 B1 B3 5 (这只是一个例子)。

答案 4 :(得分:0)

这种方式适用于像你这样的多维数据库:

$test = array_intersect_key($list_of_phones, array(array("Manufacturer" => "Motorola", "Carrier" => "Verizon")));

答案 5 :(得分:0)

// $needle example: ["Manufacturer" => "Motorola", "Carrier" => "Verizon"]
$needle = ['1st-key' => $value1, '2nd-key' => $value2];
$result = array_filter($haystack, function($item) use ($needle) {
  return ($item['1stkey'] == $needle['1st-key'] & $item['2nd-key'] == $needle['2nd-key']);
});

我正在使用这样的东西并且它有效。它返回一个由相应 $haystack 项的正确键键控的数组。我认为这更有意义和紧凑。