【问题标题】:Understanding the basics of multidimensional arrays了解多维数组的基础知识
【发布时间】:2012-07-12 14:21:20
【问题描述】:

我不熟悉在 php 中使用多维数组,我试图远离它们,因为它们让我感到困惑,但现在是时候好好利用它们了。我一直试图了解它们是如何工作的,但我就是不明白。

我要做的是根据字符串比较函数填充结果,一旦我找到与“项目名称”匹配的内容,我希望第一个插槽包含“项目名称”,然后我想将优先级槽增加 1。

所以当我完成填充我的数组时,它将有各种不同的公司名称,每个都有各自的优先级...

我无法理解如何声明和操作以下数组:

$matches = array(
    'name'=>array('somename'),
    'priority'=>array($priority_level++)
);

【问题讨论】:

  • 您的描述听起来不像是多维数组。这听起来像是键值对的一维数组。多维数组是数组的数组。除非您的“优先级”值是一个数组,否则您不需要多维。

标签: php


【解决方案1】:

因此,在您所拥有的内容中,您的变量 $matches 将指向一个键控数组,该数组的“名称”元素将是一个带有 1 个条目“somename”的索引数组,将有一个“优先级”条目一个值,它是一个索引数组,其中一个条目 = $priority_level。

我认为,您可能想要的是:

$matches[] = array(name => 'somename', $priority => $priority_level++);

这样,$matches 是一个索引数组,其中每个索引都包含一个键控数组,因此您可以将它们寻址为:

$matches[0]['name']$matches[0]['priority'],这对大多数人来说更符合逻辑。

【讨论】:

  • 这是有道理的!所以,每次我做 $matches[ ]['name'] = 'somename';它将存储在数组的“下一个”插槽中吗?同样在您上面的声明中,您的意思是说 name 不是“name”吗?
【解决方案2】:

多维数组很容易。它们只是一个数组,其中的元素是其他数组。

所以,你可以有 2 个独立的数组:

$name = array('somename');
$priority = array(1);

或者你可以有一个包含这两个数组作为元素的数组:

$matches = array(
    'name' => array('somename'),
    'priority' => array(1)
);

因此,使用$matches['name'] 与使用$name 相同,它们都是数组,只是存储方式不同。

echo $name[0]; //'somename';
echo $matches['name'][0]; //'somename';

因此,要向$matches 数组添加另一个名称,您可以这样做:

$matches['name'][] = 'Another Name';
$matches['priority'][] = 2;

print_r($matches); 会输出:

Array
(
    [name] => Array
        (
            [0] => somename
            [1] => Another Name
        )

    [priority] => Array
        (
            [0] => 1
            [1] => 2
        )

)

【讨论】:

    【解决方案3】:

    在这种情况下,这也是一维数组的解决方案吗?

    $matches    = array(
            'company_1' => 0,
            'company_2' => 0,
    );
    
    if (isset($matches['company_1'])) {
        ++$matches['company_1'];
    } else {
        $matches['company_1'] = 1;
    }
    

    它查找名称是否已经在列表中。如果不是,它会为此值设置一个array_key。如果它找到一个已经存在的值,它只会提高“优先级”。

    【讨论】:

      【解决方案4】:

      在我看来,更容易使用的结构应该更像这样:

      $matches = array(
          array( 'name' => 'somename', 'priority' => $priority_level_for_this_match ),
          array( 'name' => 'someothername', 'priority' => $priority_level_for_that_match )
      )
      

      要填充这个数组,首先要创建一个空数组:

      $matches = array();
      

      然后,找到所有匹配项。

      $match = array( 'name' => 'somename', 'priority' => $some_priority );
      

      要将该数组添加到您的匹配项中,只需将其放在末尾即可:

      $matches[] = $match;
      

      一旦它被填满,你就可以轻松地对其进行迭代:

      foreach($matches as $k => $v) {
          // The value in this case is also an array, and can be indexed as such
          echo( $v['name'] . ': ' . $v['priority'] . '<br>' );
      }
      

      也可以按照优先级对匹配的数组进行排序:

      function cmp($a, $b) {
          if($a['priority'] == $b['priority'])
              return 0;
          return ($a['priority'] < $b['priority']) ? -1 : 1;
      }
      usort($matches, 'cmp');
      

      (来自this answer

      【讨论】:

        【解决方案5】:
        $matches['name'][0]   --> 'somename'
        $matches['priority'][0]  ---> the incremented $priority_level value
        

        【讨论】:

        • 这不是一个使用两个不同数组的例子吗?
        • PHP 的多维数组实际上只是名义上的多维。它们实际上只是...的数组的数组。将每个嵌套级别视为文件系统中的子目录,并且每个“目录”都通过[...] 表示法指定。我上面提到的是您在 PHP 中使用的内容来访问您在示例中保存在子数组中的值。
        【解决方案6】:

        就像大卫在 cmets 中所说的那样,听起来您没有使用正确的工具来完成这项工作。试试:

        $priorities = array();
        foreach($companies as $company) {
            if (!isset($priorities[$company])) { $priorities[$company] = 0; }
            $priorities[$company]++;
        }
        

        然后您可以通过检查$priorities['SomeCompanyName'];来访问优先级。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-11
          • 2021-04-07
          • 2011-06-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多