为什么 PHP 数组中的 html '#XXXXXX' 颜色代码在调用所有以逗号分隔创建的数组值的 for 循环中会被忽略? (AshTag 问题?)

问题描述 投票:0回答:1

我试图允许基于浏览器的十六进制键盘的用户将十六进制键的颜色更改为 6 种基本(红色、紫色、蓝色、绿色、黄色、橙色)键颜色以外的颜色。颜色由第一个字母定义,这些字母小写以适应 ColorCodeToFirstLetters 数组的键,或者由以 Ashtag 开始的 html 颜色代码定义,后跟 6 个十六进制字符。这是 PHP 代码,其中十六进制键显示循环中使用的变量...

    // PHP Variables used in some places in the document, notably to display all Hex Keys

$OrderedColors = [];
$RawColorSequence =explode(',',$_POST['ColorSequence']);
$ColorsToFirstLetters = ['r' => '红色','p' => '紫色','b' => '蓝色','g' => '绿色','y' => '黄色',' o' => '橙色'];
  foreach($RawColorSequence as $ColorFirstLetterOrRGBCode) {
  $ColorFirstLetterOrRGBCodeSplit =explode('',$ColorFirstLetterOrRGBCode);
     if ($ColorFirstLetterOrRGBCodeSplit[0] == chr(35)) {
     $OrderedColors[] = $ColorFirstLetterOrRGBCode;
     } 其他 {
     $ToLower = strtolower($ColorFirstLetterOrRGBCode);
       if (in_array($ToLower,array_keys($ColorsToFirstLetters))) {
       $OrderedColors[] = $ColorsToFirstLetters[$ToLower];
       }
     }
   }
$ColorPointer = 0;

这是十六进制键显示循环的开始,其中以 ashTag 开始的 ColorSequence 值似乎被忽略了:

    // Loops each Row
for ($CurrentRow = 0; $CurrentRow <= $MaxRow; $CurrentRow += 0.5) {
        // Loops each Column
    for ($CurrentColumn = 0 + ($CurrentRow - floor($CurrentRow)); $CurrentColumn <= $MaxColumn; $CurrentColumn++) {
    $VarsNameRow = str_replace('.','_',$CurrentRow);
    $VarsNameColumn = str_replace('.','_',$CurrentColumn);
        // Drops the Hex Key's html code via PHP
    echo "<span style='color:white'>Now dropping an Hex Key with color '{$OrderedColors[$ColorPointer]}'</span><br>";
    eval("DropHexKey('{$OrderedColors[$ColorPointer]}','{$VarsNameRow}','{$VarsNameColumn}',{$NoteRank});");

评估线永远不会发生...... 结果可见于 https://www.chord-book.com/HexKeyboard/HexKeyboard.php (单击黄边图标以显示“颜色”字段,然后自己尝试一下,输入“R,#00FF00,P”,它将仅显示红色和紫色的十六进制键...:(

php arrays foreach
1个回答
0
投票

代码中的问题似乎是由您如何处理 $RawColorSequence 中的颜色引起的。具体来说,您分割和检查每个颜色代码的第一个字符的方式不正确。

要解决此问题,首先您需要纠正颜色代码验证,确保颜色代码以“#”开头并且只有 7 个字符。

foreach ($RawColorSequence as $ColorFirstLetterOrRGBCode) {
    // Check if the color code starts with a '#' and has a valid length of 7 characters
    if (strpos($ColorFirstLetterOrRGBCode, '#') === 0 && strlen($ColorFirstLetterOrRGBCode) === 7) {
        $OrderedColors[] = $ColorFirstLetterOrRGBCode;
    } else {
        // Convert to lowercase and check if it's a valid color key
        $ToLower = strtolower($ColorFirstLetterOrRGBCode);
        if (array_key_exists($ToLower, $ColorsToFirstLetters)) {
            $OrderedColors[] = $ColorsToFirstLetters[$ToLower];
        }
    }
}

然后在第二步检查而不是 in_array 尝试使用 array_key_exists 来检查有效的颜色键:

for ($CurrentRow = 0; $CurrentRow <= $MaxRow; $CurrentRow += 0.5) {
    // Loops each Column
    for ($CurrentColumn = 0 + ($CurrentRow - floor($CurrentRow)); $CurrentColumn <= $MaxColumn; $CurrentColumn++) {
        $VarsNameRow = str_replace('.', '_', $CurrentRow);
        $VarsNameColumn = str_replace('.', '_', $CurrentColumn);
        // Drops the Hex Key's html code via PHP
        echo "<span style='color:white'>Now dropping a Hex Key with color '{$OrderedColors[$ColorPointer]}'</span><br>";
        eval("DropHexKey('{$OrderedColors[$ColorPointer]}','{$VarsNameRow}','{$VarsNameColumn}',{$NoteRank});");
        // Increment the color pointer, wrapping around if necessary
        $ColorPointer = ($ColorPointer + 1) % count($OrderedColors);
    }
}

最后,确保使用模运算符环绕颜色指针增量。 试试这个,让我知道它是否有效:)

© www.soinside.com 2019 - 2024. All rights reserved.