簡體   English   中英

了解多維數組的基礎

[英]Understanding the basics of multidimensional arrays

我是初次使用php的多維數組,我試圖遠離它們,因為它們使我感到困惑,但是現在是時候讓我充分利用它們了。 我一直在嘗試了解它們的工作原理,但我只是沒有理解。

我想做的是基於字符串比較函數填充結果,一旦找到與“項目名稱”的匹配項,我希望第一個廣告位包含“項目名稱”,然后我想增加優先級插槽1。

因此,當我全部完成數組的填充后,它將具有各種不同的公司名稱,每個公司名稱都具有各自的優先級...

我在理解如何聲明和操作以下數組時遇到麻煩:

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

多維數組很容易。 它們都是一個數組,而元素是其他數組。

因此,您可以有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
        )

)

因此,根據您的情況,變量$ matches將指向一個鍵控數組,該數組的“名稱”元素將是一個帶有1個條目“ somename”的索引數組,並且將存在一個“ priority”條目,其值是具有一個條目= $ priority_level的索引數組。

我認為,相反,您可能想要的是:

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

這樣,$ matches是一個索引數組,其中每個索引都保存一個鍵控數組,因此您可以將它們尋址為:

$matches[0]['name']$matches[0]['priority'] ,對大多數人來說更合乎邏輯。

我認為,一種更易於使用的結構應該像這樣:

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

(來自此答案

在這種情況下,這是否也可以是一維數組的解決方案?

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

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

查找名稱是否已經在列表中。 如果不是,它將為此值設置一個array_key 如果找到一個已經存在的值,它只會提高“優先級”。

$matches['name'][0]   --> 'somename'
$matches['priority'][0]  ---> the incremented $priority_level value

就像戴維(David)在對問題的評論中說的那樣,聽起來您在使用正確的工具來完成工作。 嘗試:

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

然后,您可以通過檢查$priorities['SomeCompanyName'];訪問優先$priorities['SomeCompanyName'];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM