Как пройти через foreach до тех пор, пока X не будет найден, если не найден, ищите Y - PullRequest
0 голосов
/ 16 мая 2018

Извините, если это дубликат, я не могу понять, что искать, чтобы найти ответ.

У меня есть цикл foreach, и в этом цикле я пытаюсь проверить, (A == B). Затем, однажды найденный, я разрываю петлю. Если (A! = B) в итерации, я проверяю, если (X == Y).

Моя проблема в том, что если (X == Y) сначала будет установлено, что истина, цикл прерывается раньше, если (A == B) можно проверить.

Есть ли лучший способ выполнить эту задачу?

$variable[1] = ['A' => 'n', 'X' => 'n'];
$variable[2] = ['A' => 'n', 'X' => 'Y'];
$variable[3] = ['A' => 'B', 'X' => 'n'];

$test = 'B';

foreach ($variable as $value) {

    if($value['A'] == $test || $value['X'] == "Y") {
        echo 'The results: ' . $value['A'];
        break;
    }

}

// The results for $variable[2] are returned. I need the results for $variable[3] to be returned.

У меня был оператор else, который работал нормально, но мне приходилось дублировать вывод.

Заранее спасибо!

Приведенный выше код является упрощенной версией того, над чем я работаю. Вот код, над которым я работаю на самом деле.

foreach ($product_xml->products->product_styles as $style => $attribute) {
    if(isset($_GET['color']) && $attribute['color'] == $color_selected || $attribute['is_default'] == "1") {
        foreach ($attribute as $value){
            $imgURL = (string)$value['imgurl'];
            $thumburl = (string)$value['thumburl'];
            $thumburl_array[(string)$value['side']] = (string)$value['thumburl'];
            if (in_array($imgURL, $values)){continue;}
            else{
                array_push($values, $imgURL);
                $imgURL = str_replace("REPLACE_DOMAIN_WITH",IDEQ_INKSOFTAPI_URL_SECURE,$imgURL );
                $thumburl = str_replace("REPLACE_DOMAIN_WITH",IDEQ_INKSOFTAPI_URL_SECURE,$thumburl );
                $thumburl = str_replace("150.png","500.png",$thumburl );
                echo '<img src="'.$imgURL.'" class="pic'.$counter.'" title="'.$value['name'].'">';
                $counter++;
            }
        }
        break;
    }
}

Ответы [ 4 ]

0 голосов
/ 16 мая 2018

Исходя из ответа Джеймс Лалор Я пришел к этому решению. Если кто-нибудь увидит лучший / более оптимальный способ справиться с этим, я хотел бы услышать!

$counter = 1;
$values = array();
$thumburl_array = array();
$found = false;
$find_default = false;
$style_count = count($product_xml->products->product_styles);

for ($i=0; $i < $style_count; $i++) { 
    if (isset($_GET['color']) && $product_xml->products->product_styles[$i]['color'] == $color_selected) {
        $found = true;
    } elseif (!$found && !$find_default && $i == $style_count - 1) {
        $find_default = true;
        $i = 0;
    }

    if ($find_default && $product_xml->products->product_styles[$i]['is_default'] == '1') {
        $found = true;
    }

    if ($found) {
        foreach ($product_xml->products->product_styles[$i] as $value){
            $imgURL = (string)$value['imgurl'];
            $thumburl = (string)$value['thumburl'];
            $thumburl_array[(string)$value['side']] = (string)$value['thumburl'];
            if (in_array($imgURL, $values)){continue;}
            else{
                array_push($values, $imgURL);
                $imgURL = str_replace("REPLACE_DOMAIN_WITH",IDEQ_INKSOFTAPI_URL_SECURE,$imgURL );
                $thumburl = str_replace("REPLACE_DOMAIN_WITH",IDEQ_INKSOFTAPI_URL_SECURE,$thumburl );
                $thumburl = str_replace("150.png","500.png",$thumburl );
                echo '<img src="'.$imgURL.'" class="pic'.$counter.'" title="'.$value['name'].'">';
                $counter++;
            }
        }
        break;
    }
}

Упрощенная версия

$variable[] = ['A' => 'n', 'X' => 'n', 'result' => 'do'];
$variable[] = ['A' => 'n', 'X' => 'Y', 'result' => 're'];
$variable[] = ['A' => 'B', 'X' => 'n', 'result' => 'mi'];

$found = false;
$find_default = false;
$count = count($variable);

$test = 'B';

for ($i=0; $i < $count; $i++) { 
    if ($variable[$i]['A'] == $test) {
        $found = true;
    } elseif (!$found && !$find_default && $i == $count - 1) {
        $find_default = true;
        $i = 0;
        continue;
    }

    if ($find_default && $variable[$i]['X'] == 'Y') {
        $found = true;
    }

    if ($found) {
        echo "Resulsts: " . $variable[$i]['result'];
        break;
    }
}

Спасибо всем за отзыв, высоко ценится. Приветствия.

0 голосов
/ 16 мая 2018

Вот мое приближение с функцией:

function search($variable, $test){
    $alternative = null;

    foreach($variable as $value){
        if($value['A'] == $test){
            return $value['A'];
        }
        if($value['X'] == 'Y' && $alternative === null){
            $alternative = $value['A'];
        }
    }

    return $alternative;
}

Она вернет первое совпадение на A и, если не найдено, первое совпадение на X.

Таким образом, вы только циклически проходите foreach один раз.

0 голосов
/ 16 мая 2018

Вместо зацикливания вы можете использовать array_column, чтобы изолировать один столбец массива A или X.
Затем используйте in_array, чтобы увидеть, найдете ли вы $ test в массиве.

$test = 'B';
$test2 = 'Y';

If(in_array($test, array_column($variable, "A"))){
    Echo $test . " Found in A";
}Else if(in_array($test2, array_column($variable, "X"))){
    Echo $test2 . " Found in B";
}else{
    Echo "none found";
}

https://3v4l.org/dv7Yp

0 голосов
/ 16 мая 2018

Используйте временную переменную и переместите echo после foreach.

$variable[1] = ['A' => 'n', 'X' => 'n'];
$variable[2] = ['A' => 'n', 'X' => 'Y'];
$variable[3] = ['A' => 'B', 'X' => 'n'];

$test = 'B';
$output = null;

foreach ($variable as $value) {

    if($value['A'] == $test) {
        $output = $value['A'];
        break;
    } else if ($output == null && $value['X'] == "Y") {
        $output = $value['X'];
    }
}

echo 'The results: ' . $output;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...