2012-07-12 93 views
0

我對使用多維數組與php是新手,我試圖遠離他們,因爲他們困惑我,但現在時機已到,我把它們用得很好。我一直在試圖瞭解他們是如何工作的,而我只是沒有得到它。瞭解多維數組的基礎知識

我想要做的是填充基於字符串比較函數的結果,一旦我找到'項目名稱'的一些匹配,我想第一個插槽包含'項目名稱',那麼我想1。

所以遞增優先口的時候,當我做了所有我的填充陣列,它都將有各種不同的公司名稱,每一個都有各自的優先級...

我無法理解如何聲明和操作以下數組:

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

您的描述聽起來不像多維數組。這聽起來像是一個鍵值對的一維數組。多維數組是數組的數組。除非你的「優先級」值是一個數組,否則你不需要多維。 – David 2012-07-12 18:46:28

回答

1

所以,你有什麼,你的變量$ matches將指向一個鍵控數組,該數組的'name'元素將是一個帶有1個條目'somename'的索引數組,將會有一個'priority'條目,其值是一個索引編排y有一個條目= $ priority_level。

我想,而不是你可能想的是一樣的東西:

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

這樣,$匹配是一個索引數組,其中每個索引持有密鑰的陣列,這樣你就可以解決這些問題爲:

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

+1

這很有道理!所以,每次我做$ matches [] ['name'] ='somename';它會將它存儲在數組的「下一個」插槽中?同樣在你上面的聲明中,你是不是指名字是'名字'? – AnchovyLegend 2012-07-12 18:55:02

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

是不是這個使用兩個不同數組的例子? – AnchovyLegend 2012-07-12 18:50:05

+0

PHP的多維數組真的只是名義上的多維。它們真的只是陣列數組的陣列。將每個嵌套級別想象爲文件系統中的子目錄,並且每個「目錄」都是通過'[']'表示法指定的。上面提到的是你在PHP中用來訪問你在你的例子中保存在你的子數組中的值。 – 2012-07-12 18:51:44

1

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

所以,你可以有2個獨立的陣列:

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

或者你可以有一個具有這2個數組作爲元素的數組:

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

) 
0

就像大衛在關於這個問題的評論中所說的那樣,這聽起來像是你沒有使用正確的工具來完成這項工作。嘗試:

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

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

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

(源自this answer

1

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

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

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

它查找名稱是否已經在列表中。如果不是,則爲該值設置一個array_key。如果它發現一個已經存在的價值,它只會提高「優先級」。