[英]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.