我在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>";
}
答案 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