识别相同的数组键匹配并指定不同匹配集的输出

时间:2013-05-17 15:22:11

标签: php arrays if-statement multidimensional-array string-matching

我创建了一个简单的函数,它返回一个值,具体取决于哪些键具有匹配的值,但是如果键为空或为null则不会计算。我的代码如下。

function getFontData(){

    $font = [];
    $font['Font'] = 'Arial';
    $font['Font2'] = 'Arial';
    $font['Font3'] = 'Arial';

    return $font;

}


function compareFonts(){

    $compare = 0;


    $font = getFontData();



   if (!empty($font['Font']) && $font['Font'] === $font['Font2']) {
        $compare = 1;
    } elseif (!empty($font['Font']) && $font['Font'] === $font['Font3']) {
        $compare = 2;
    } elseif (!empty($font['Font2']) && $font['Font2'] === $font['Font3']) {
        $compare = 3;

    }elseif (!empty($font['Font']) && $font['Font'] === $font['Font2'] && $font['Font2'] === $font['Font3']) {
        $compare = 4;
    };

    return $compare;

}

$matches = compareFonts();

var_dump($matches);

我遇到的问题是我为函数识别三个相同数组键的代码似乎没有在我的if语句中执行。这个例子中的输出是1.它向我表明我的代码返回的第一个if语句本质上是真的,因为两个' font'和' font2'匹配所以代码不需要更进一步。

我假设有更好的方法可以做到这一点,或者我的方法完全错误。欢迎所有建议。

问候

w9914420

2 个答案:

答案 0 :(得分:0)

您遇到elsif

的问题
if (!empty($font['Font']) && $font['Font'] === $font['Font2']) {
        $compare = 1;
    } elseif (!empty($font['Font']) && $font['Font'] === $font['Font3']) {
        $compare = 2;
    } elseif (!empty($font['Font2']) && $font['Font2'] === $font['Font3']) {
        $compare = 3;

    }elseif (!empty($font['Font']) && $font['Font'] === $font['Font2'] && $font['Font2'] === $font['Font3']) {
        $compare = 4;
    };

在此代码中,第一个if将评估为TRUE,因此将不会测试elsif,并且代码将直接跳到最后。你需要这样的东西:

$compare=0;
if (!empty($font['Font']){ 
    if($font['Font'] === $font['Font2']) {
        $compare++;
    }
    if ($font['Font'] === $font['Font3']) {
        $compare++;
    }
    if ($font['Font2'] === $font['Font3']) {
        $compare++;
    }
    if ($font['Font'] === $font['Font2'] && $font['Font2'] === $font['Font3']) {
        $compare++;
    }
}

除了这个问题,这段代码有点过于具体,如果你现在需要10多个字体怎么办?也许我们可以尝试使它更简单:

$font = [];
for($x=0; $x<10;$x++){  //10 fonts
    $font['Font'.$x] = 'Arial';
}

$compare=0;
if (!empty($font['Font']){ 
    for($x=0; $x<count($font); $x++){
        for($y=1;$y<(count($font)-$x+1);$y++){
             if($font['Font'.$x] == $font['Font'.$y]){
                 $compare++;
             }
        }
    }
}

我没有太多时间来测试它,但它应该比以前的代码更容易维护。

答案 1 :(得分:0)

正如Naryl所指出的那样,Nested If声明是前进的方向。

$compare=0;
if (!empty($font['Font']){ 
if($font['Font'] === $font['Font2']) {
    $compare++;
}
if ($font['Font'] === $font['Font3']) {
    $compare++;
}
if ($font['Font2'] === $font['Font3']) {
    $compare++;
}
if ($font['Font'] === $font['Font2'] && $font['Font2'] === $font['Font3']) {
    $compare++;
}
}

如果font1的条件与字体3相同,那么if语句只执行第一个语句,这个代码是完美的。因此我必须创建一个更明确的搜索条件并想出这个。< / p>

    function compareFonts(){

    $compare = 0;
    $font = getFontData();

if (!empty($font['Font'])){ 

    if ($font['Font'] === $font['Font2'] && $font['Font2'] === $font['Font3']) {
    $compare = 1;
    }

    if($font['Font'] === $font['Font2'] && $font['Font3'] == NULL) {
    $compare = 2;
    }
    }
if (!empty($font['Font2'])){
    if ($font['Font2'] === $font['Font3'] && $font['Font'] == NULL) {
    $compare = 3;
    }
}

if (!empty($font['Font3'])) {

    if ($font['Font'] === $font['Font3'] && $font['Font2'] == NULL) {
    $compare = 4;
    }

}

    return $compare;

} 

我在这个问题背后的想法是,由于条件是基于所有三种字体的值,因此if语句参数解决这个问题是有意义的。

// this will execute regardless of the value of [font'3]
$font['Font'] === $font['Font2']

// this is very specific in that [font'3] must be null.
$font['Font'] === $font['Font2'] && $font['Font3'] == NULL

// This works because empty array key is converted to null by non-strict equal 
// '==' comparison. For example the following code shows this.

$cho = [];
$cho['key'] = '';

if ($cho['key'] == Null){
    echo 'true';
}
 // returns true.

同样这是一个非常独特的条件,但可能有更好的方法,所以请随时发表评论。

再次感谢w9914420。