【问题标题】:Searching in a multi-dimensional array (PHP)在多维数组中搜索 (PHP)
【发布时间】:2010-11-04 13:18:24
【问题描述】:

我最近遇到了一个让我发疯的问题。我有一个这样的多维数组:

$a = array(
'db' => array(
    '0' => array(
        'id' => '1',
        'name' => 'test',
        'cat' => array(
            'a' => '15',
            'b' => '20',
            'c' => '30'
        ),
        'canvas' => '2'
    ),
    '1' => array(
        'id' => '2',
        'name' => 'test2',
        'cat' => array(
            'a' => '15',
            'b' => '20',
            'c' => '30'
        ),
        'canvas' => '2'
    )
    '2' => array(
        'id' => '3',
        'name' => 'test',
        'cat' => array(
            'a' => '50',
            'b' => '40',
            'c' => '90'
        ),
        'canvas' => '1'
    )
)
);

我想使用这样的函数搜索它:search('canvas = 1');

这将返回所有数组,即 db 的子数组,其键画布的值为 1。或者,例如:

搜索('a = 15');

将返回所有具有键、cat 的子项、名为 a 且值为 15 的数组。

【问题讨论】:

  • 在这种情况下你想完成什么?我觉得可能有更优雅的解决方案,但这取决于您要解决的问题。

标签: php


【解决方案1】:
$a = array(
'db' => array(
    '0' => array(
        'id' => '1',
        'name' => 'test',
        'cat' => array(
            'a' => '15',
            'b' => '20',
            'c' => '30'
        ),
        'canvas' => '2'
    ),
    '1' => array(
        'id' => '2',
        'name' => 'test2',
        'cat' => array(
            'a' => '15',
            'b' => '20',
            'c' => '30'
        ),
        'canvas' => '2'
    ),
)
);

//checks if array $array contains element with $searchKey key, and $searchVal value
function arrayContains($array, $searchVal, $searchKey) {
        if (!is_array($array))
            return false;
        foreach ($array as $key => $value) {
            if ($key === $searchKey && $searchVal === $value)
                return true;
            if (is_array($value) && arrayContains($value, $searchVal, $searchKey))
                return true;
        }
        return false;
    }

function search($a, $search) {
    list($searchKey, $searchVal) = explode('=', $search);
    $result = array();
    foreach($a as $val) {
        if (arrayContains($val, $searchVal, $searchKey))
            $result[] = $val;
    }
    return $result;
}

print_r(search($a['db'], "a=15"));
print_r(search($a['db'], "canvas=1"));

产生这个输出(输出包含搜索到的 key=>value 对的 $a['db'] 的子数组):

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => test
            [cat] => Array
                (
                    [a] => 15
                    [b] => 20
                    [c] => 30
                )

            [canvas] => 2
        )

    [1] => Array
        (
            [id] => 2
            [name] => test2
            [cat] => Array
                (
                    [a] => 15
                    [b] => 20
                    [c] => 30
                )

            [canvas] => 2
        )

)
Array
(
    [0] => Array
        (
            [id] => 3
            [name] => test
            [cat] => Array
                (
                    [a] => 50
                    [b] => 40
                    [c] => 90
                )

            [canvas] => 1
        )

)

【讨论】:

    【解决方案2】:

    如果这对您有帮助,请查看以下链接 - http://php.net/manual/en/function.array-search.php

    它包含php函数array_search()的详细文档以及用于在多维数组中搜索的各种用户代码以及用户评论。

    【讨论】:

      【解决方案3】:
      function search($array, $canvas)
      {
          $result = array();
          foreach ($array as $k1 => $v1) {
              foreach ($v1 as $k2 => $v2) {
                  if ($v2['canvas'] == $canvas) {
                      $result[] = $array[$k1][$k2];
                  }
              }
          }
          return $result;
      }
      
      // $a = your array
      print_r(search($a, 1));
      

      【讨论】:

      • 您的功能似乎特定于画布情况。如果我想找到 a = 50 怎么办?
      • 对不起。我不仔细阅读问题。但好的答案让@Denis。
      猜你喜欢
      • 2016-09-19
      • 2017-03-23
      • 1970-01-01
      • 1970-01-01
      • 2014-06-27
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 2011-05-20
      相关资源
      最近更新 更多