数字多维数组php

时间:2016-05-15 06:18:45

标签: php matrix multidimensional-array

我在php中有这个数字多维数组。它是Playfair矩阵,我想从矩阵中获取一个字母的键。

假设我有字母“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>";
    }

2 个答案:

答案 0 :(得分: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;
}

此函数将返回一个包含找到状态的行和列的数组或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 ) 

答案 1 :(得分: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