2016-05-15 124 views
0

我在php中有這個數字多維數組。這是Playfair矩陣,我想從矩陣中得到一個字母的鍵。數字多維數組php

比方說,我有字母「P」,它在第三行(0到4)和第二列(0到4)。我已經嘗試了幾件事array_keys(不按我想要的那樣工作),函數來獲取數組第一級的關鍵,使數組變成一維並做一些魔術技巧......沒有任何工作,我想要一些幫助。

這是獲得第一級的按鍵功能:

function array_search2($needle, $haystack){ 
    $l = count($haystack); 
    for ($i=0; $i < $l; $i++) { 
     if (in_array($needle, $haystack[$i])) return $i; 
    } 
    return false; 
} 

我想有這個數組的信件,從中獲得的兩封信,讓這兩個字母的座標(從PLayfair矩陣)並編譯它們的行/列。 謝謝,我會發布任何需要的代碼。

編輯:我張貼我的一切:

$keyword = str_replace(' ','', $_POST['keyword']); 
$plaintext = str_replace(' ','', $_POST['plaintext']); 

$key = str_split($keyword); //string to array 
$plain = str_split($plaintext); //string to array 

$alphabet = array(
       0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd', 4 => 'e', 5 => 'f', 
       6 => 'g', 7=> 'h', 8 => 'i', 9 => 'j', 10 => 'k', 11 => 'l', 
       12 => 'm', 13 => 'n', 14 => 'o', 15 => 'p', 16 => 'q', 17 => 'r', 
       18 => 's', 19 => 't', 20 => 'u', 21 => 'v', 22 => 'w', 23 => 'x', 
       24 => 'y'); 
for ($i=0; $i < count($key); $i++) { 
     for ($j=0; $j < count($alphabet) ; $j++) { 
      if ($keyword[$i] == $alphabet[$j]) { 
       unset($alphabet[$j]); 
      } 
     } 
    } 
    $keywordFilpped = array_flip($key); 
    $alphabetFlipped = array_flip($alphabet); 

    $mergedFlipped = $keywordFilpped + $alphabetFlipped; 

    $i = 0; 
    foreach ($mergedFlipped as $key => $value) { 
     $mergedFlipped[$key] = $i; 
     $i++; 
    } 

    $merged = array_flip($mergedFlipped); 
$index = 0; 
    for ($i=0; $i < 5; $i++) { 
     for ($j=0; $j < 5; $j++) { 
      $matrix[$i][$j] = $merged[$index]; 
      $index++; 
     } 
    } 
    echo "PLAYFAIR MATRIX:<br>"; 
    for ($i=0; $i < 5; $i++) { 
     for ($j=0; $j < 5; $j++) { 
      echo $matrix[$i][$j]; 
     } 
      echo "<br>"; 
    } 
+0

你的代碼有單維數組''echo array_search('p',$ alphabet)'..這個應該可以工作 –

+0

是的,它應該可以工作,如果我想從$字母搜索,但我想搜索$矩陣。因此,我應該得到兩個鍵(例如$ i,$ j)。 –

+0

也不需要指定數字索引,php會自動做到這一點。 –

回答

0

如果你有一個矩陣應與2檢查就像下面的代碼:在上面的例子中我檢查

for($i = 1; $i <= 11; $i++) 
{ 
    for($j = 1; $j <= 11; $j++) 
    { 
     if($array[$i][$j] == 'p') echo "row=$i and col = $j"; 
    } 
} 

所有行和列cols

使用此功能

function array_search2($needle, $haystack){ 
    $i = 0; 
    foreach($haystack as $key => $value) 
    { 
     $j = 0; 
     foreach($value as $key2 => $value2) 
     { 
       if($value2 == $needle) 
        return array($i, $j); 

       $j++; 
     } 
     $i++; 
    } 
    return false; 
} 

這個函數將返回一個數組包含行和列的發現狀態或錯誤;

$array = array(0 => array(0 => 'a', 1=> 'b'), 1 => array(0 => 'c', 1=> 'd')); 
print_r(array_search2('d', $array)); 
// out put Array ([0] => 1 [1] => 1) 
+0

問題是我不會爲一個字母尋找硬核。這是困擾我的問題。 –

+0

我爲您提供了新功能 –

+0

謝謝!有用。現在我必須弄清楚如何做其餘的事情!再次感謝你。 –

0

我已經改善你的功能,這將返回鍵,如果發現匹配,無論深度,見下面的例子:

function getArrayKeys($needle, $haystack, $depth = 0) { 
    $keys = array(); 
    foreach($haystack as $key => $value) { 
     if(is_array($value)){ 
      $result = getArrayKeys($needle, $value, $depth + 1); 
      if(!empty($result) || $result === 0) { 
       if (is_array($result)) { 
        $keys = array_merge($keys, $result); 
       } else { 
        $keys[] = $result; 
       } 
       $keys[] = $key; 
      } 

      if(!empty($keys) && $depth > 0) 
       return $keys; 
     } elseif($value == $needle) { 
      return $key; 
     } 
    } 
    return !empty($keys) ? array_reverse($keys) : false; 
} 

$arr = array(
    array('A', 'B', 'C'), 
    array('D', 'F', 'E'), 
    array('Z', 'Y', 'X'), 
    array('f' => '44', 'g' => array('99')) 
); 
$keys = getArrayKeys('99', $arr); 

輸出:

我用以下測試數據

Array 
(
    [0] => 3 
    [1] => g 
    [2] => 0 
) 

查看它運行:https://eval.in/571698