2010-07-17 83 views
0

我得到的值的數組回從數據庫,在那裏我得到一個數組的值是這樣的:PHP,可能有一個數組值的多個鍵?

Array ([6712] => 64.79.197.36:43444 [6712] => 64.79.197.36:43444 [6711] => 64.79.194.56:41113 [6710] => 64.21.47.20:8080 [6709]) 

其中括號中的數字,如[6712]是在數據庫中的「ID」字段..的問題是,在我的劇本我想讓它使得每個數組值有我給你第二個關鍵,這從「0」遞增1開始,並,所以是這樣的:

Array ([0][6712] => 64.79.197.36:43444 [1][6712] => 64.79.197.36:43444 [2][6711] => 64.79.194.56:41113 [3][6710] => 64.21.47.20:8080 [4][6709]) 

這是爲了一些數據處理,所以我想能夠有一種方法來跟蹤我的腳本中的每一個有意義的方式(因爲我不能預測什麼MySQL ID將作爲有可能會刪除記錄等,所以它並不總是遞增1)..

我已經找到了一些方法來創建一個新的數組,通過分配一個新的密鑰,但我想知道如果它可能有2個鍵1數組值

回答

5

這是完全可能的,使用參考。

$result = array (6712 => '64.79.197.36:43444', 
        6711 => '64.79.194.56:41113', 
        6710 => '64.21.47.20:8080' 
       ); 
$i = 0; 
foreach($result as $key => $value) { 
    $result[$i++] = &$result[$key]; 
} 

var_dump($result); 
echo '<br />'; 
$result[0] = '127.0.0.1:80'; 

var_dump($result); 
echo '<br />'; 

但它可能會證明您的工作有問題。

上述代碼titbit演示如何設置初始數組,然後爲初始數組中的三個值中的每一個分配第二個鍵。 然後,代碼修改數組中的單個條目,並證明更改反映在兩個鍵值中;

編輯

有一個陣列的兩個鍵會很麻煩有,如果你想使用的foreach(),CURR()的工作,並操縱數組中的位置,其他控制結構元素,因爲你會拿起每個條目兩次。

使用兩個數組可能會更容易,其次是一系列指向第一個數組的指針。

$result = array (6712 => '64.79.197.36:43444', 
        6711 => '64.79.194.56:41113', 
        6710 => '64.21.47.20:8080' 
       ); 
$wrkResult = array(); 
foreach($result as $key => $value) { 
    $wrkResult[] = &$result[$key]; 
} 

var_dump($result); 
echo '<br />'; 
var_dump($wrkResult); 
echo '<br />'; 
$result[0] = '127.0.0.1:80'; 

var_dump($result); 
echo '<br />'; 
var_dump($wrkResult); 
echo '<br />'; 

然後你就可以使用工作既$結果或$ wrkResult,並以一個將在其它進行refelected值的任何變化;你可以通過一個或其他,只得到結果,而不是兩倍多的正確數量等循環

+0

謝謝,就我而言,初始密鑰是真實的y是腳本中的一個未知變量,它只是由mysql數據庫給出的,並且沒有使用它的參考點,它僅在對相應的值進行更改後更新數據庫纔有用,所以其他鍵將是我將在php腳本中使用,所以我不認爲用這種方式工作會太難 – Rick 2010-07-18 00:43:20

+0

第二個好得多(考慮將來的「foreaching」),爲了保持一致性,我建議將所有id存儲在「main」數組中 - 那麼如果你訪問任何密鑰,你總是可以知道哪些密鑰訪問相同:)編輯解決方案:) – 2013-09-04 14:47:19

+0

使用第二個問題是,如果你把它放在MongoDb中,那麼它不會得到正確的密鑰。因此,我只是在我的語義關鍵字中使用了一個特殊字符,如果它不存在,那麼我會「繼續」foreach循環。這樣,你不會得到「兩次返回」的問題... – CommaToast 2014-11-21 23:34:25

1

嗯,我的PHP是一個有點生疏,但讓我破解這一個我塵封的關節:

我會做一個變壓功能這一點。它接受第一個數組作爲其輸入(以「6712」等作爲關鍵字),並返回第二個數組作爲其輸出。

對不起,任何和所有的語法錯誤,但這裏有雲:

function indexer ($array) { 
    $result = array(); 
    $i = 0; 
    foreach ($array as $key => $value) { 
    $result[$i][$key] = $value; 
    $i++; 
    } 
    return $result; 
} 

但是!如果您不嚴格需要二維數組,則可以在沒有任何開銷的情況下迭代數組。請參閱reset()next()prev()函數。如果您對密鑰感興趣(您可能會遇到這種情況),另請參閱each()函數。

請記住,每個數組都有一個有狀態的內部指針。這意味着,如果你經常繞過數組,指針的狀態將被記住。所以請適當地撥打reset()

+0

感謝您抽出時間來寫這一點..我會試試看..其實下一個(),prev()應該對大多數事情的工作,我需要它只是爲了得到我的好奇心(分配第二個id),是否我可以這樣做,因爲我認爲這對於我想要做的一些更復雜的事情是必要的 – Rick 2010-07-18 00:17:41

0
$keys = array_keys($array); 
$values = array_values($array); 

$easyArray = array(); 

foreach($keys as $keyId => $key) { 
    $easyArray[$keyId] = array(
     'id'  => $key, 
     'addr' => $values[$keyId] 
    ); 
} 

然後你有一個簡單的陣列一起工作,從0到索引數的-行 - 1,用正確的維數:

// get the id of element $i: 
$easyArray[$i]['id'] 

// get the address of element $i 
$easyArray[$i]['addr'] 
相關問題