0

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

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

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

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

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

6 回答 6

1

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

因此,您可以有 2 个单独的数组:

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

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

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

因此, using$matches['name']与 using 相同$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
        )

)
于 2012-07-12T18:49:02.217 回答
1

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

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

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

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

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

于 2012-07-12T18:49:20.970 回答
1

在我看来,一个更容易使用的结构更像是这样的:

$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');

(来自这个答案

于 2012-07-12T18:51:38.933 回答
1

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

$matches    = array(
        'company_1' => 0,
        'company_2' => 0,
);

if (isset($matches['company_1'])) {
    ++$matches['company_1'];
} else {
    $matches['company_1'] = 1;
}

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

于 2012-07-12T18:54:31.197 回答
0
$matches['name'][0]   --> 'somename'
$matches['priority'][0]  ---> the incremented $priority_level value
于 2012-07-12T18:47:20.353 回答
0

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

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

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

于 2012-07-12T18:50:53.783 回答