Создать переменную внутри / после оператора if - PullRequest
0 голосов
/ 27 сентября 2019

В JSON с ключом "строка" и "значением":

'Something xxx something' = 10
'Something yyy something' = 20
'Something xxx something' = 30
'Something zzz something' = 40

Я хочу получить следующий поток:

find partial string inside string
if true
get sum of all its matched string's value
if false
return 0

То, что я пробовал, это

if (strpos($string, 'xxx') == false){
        $value = array_sum(array_column($arrayjson['string'],'value'));
        continue;
    }
echo $value

Но я получаю

100
100

Ожидаемый результат 40

Ответы [ 2 ]

3 голосов
/ 27 сентября 2019

Проблема в том, что даже если вы проверяете, содержит ли строка xxx (кстати, вы должны использовать !== false, поскольку она может возвращать 0), вы затем используете array_column(), чтобы извлечь все значения и добавить ихвсе вверх (именно поэтому вы получаете 100).

Это циклически перебирает данные и добавляет только те строки, которые соответствуют требуемой строке ...

$data = [ ['string' => 'Something xxx something', 'value' => 10],
    ['string' => 'Something yyy something', 'value'  => 20],
    ['string' => 'Something xxx something', 'value'  => 30],
    ['string' => 'Something zzz something', 'value'  => 40]];

$total = 0;
foreach ( $data as $row )   {
    if (strpos($row['string'], 'xxx') !== false){
        $total += $row['value'];
    }
}
echo $total;
1 голос
/ 27 сентября 2019

За счет увеличения числа вызовов функций и незначительного снижения эффективности вы можете избежать использования временных переменных, вложив собственные функции.(Я бы использовал способ Найджела, хотя)

Код: ( Демо )

echo array_sum(
         array_column(
             array_filter(
                 $arrayjson,
                 function($row) {
                     return strpos($row['string'], 'xxx') !== false;
                 }
             ),
             'value'
         )
     );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...