Поиск по разнесенной строке на основе переменной в сочетании со строкой - PullRequest
0 голосов
/ 27 августа 2018

В моей базе данных есть строка с именем «Корзина».

$cart = "1+10,2+10,3+10,5+10,6+10"
$openCart = explode(",", $cart);

Внутри $ openCart Я хочу найти число и знаки плюс, прежде чем добавлять новую информацию в этот массив.Я пробовал array_search и in_array , но ни один не позволил мне найти значение типа "3+".array_search позволил мне искать только полные строки, такие как «3 + 10», в то время как in_array это не нравилось, когда я заканчивал строку поиска со знаком плюс.

Дополнительный контекст: ВВ конце концов, идеальный код для этой функции был бы где-то следующим:

$pID = 3;
$pOrder = 4;
$openCart = explode(',', $cart);

//Search where $pID . "+" matches a value inside $openCart
$specProd = explode ('+' $openCart[/*Location that got matched*/]);
$specProd[1] = $specProd[1] + $pOrder;

$impProd = implode ('+', $specProd);
$specProd[] = impProd;
$newCart = implode (',', $specProd[]);

//upload the string of $newCart back to the database.

В настоящее время я просто застрял при поиске в массиве, и любая помощь будет оценена.

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

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

В любом случае, вот что я придумал сам.

$Cart = '1+10,2+10,3+10,5+10,6+10';
$pID = 3;
$pString = $pID . "+";
$pOrder = 5;
$pLoc;

echo $Cart;
echo "<br/>";
$openCart = explode (",", $Cart);

$cartLenght = count($openCart);
for ($i = 0; $i<$cartLenght; $i++){
    $pos = stripos($openCart[$i], $pString);
    if ($pos !== false){
        $pLoc = $i;
    }
}
$specProd = explode ('+', $openCart[$pLoc]);
$specProd[1] = $specProd[1] + $pOrder;
$impProd = implode('+', $specProd);
$openCart[$pLoc] = $impProd;
$finalCart = implode(",", $openCart);
echo $finalCart;

Результаты: Корзина: 1 + 10,2 + 10,3 + 10,5 + 10,6 + 10 FinalCart: 1 + 10,2 + 10,3 + 15,5 + 10,6 + 10

0 голосов
/ 27 августа 2018

Я считаю, что обработка этого как строки - самый эффективный способ сделать это.
Если вы сначала взорвались, вам нужно зациклить или пересмотреть каждый элемент массива.

Этот метод использует preg_replace_callback, который находит шаблоны и возвращает строку в соответствии с тем, что вы хотите с ней сделать.

В этом случае нам нужно найти товар и добавить изменение к номеру после знака +.

$cart = "1+10,2+10,3+10,5+10,6+10";

$product = 3;
$change = 5;

$finalcart = preg_replace_callback("/(.*" .$product . "\+)(\d+)(.*)/", function($m) use($change){
    return $m[1] . ($m[2]+$change) . $m[3];
}, $cart);
echo $finalcart;
// 1+10,2+10,3+15,5+10,6+10
//           ____ 

https://3v4l.org/XHDXH

Шаблон регулярного выражения:

"/          // start of pattern
(.*"        // capture anything 
.$product . // including the product
"\+)        // and a litteral + to $m[1]
(\d+)       // capture a number to $m[2] (the amount)
(.*)        // and capture again anything, to $m[3]
/"          // end of pattern

Это затем используется в функции обратного вызова для изменения $m[2] с помощью +$change, а затем возвращается обратно к $finalcart

0 голосов
/ 27 августа 2018

Находит ключ элемента

<?php
$cart = "1+10,2+10,3+10,5+10,6+10";
$openCart = explode(",", $cart);
$needle = "3+";
$return = array_keys(array_filter($openCart, function($var) use ($needle){
    return strpos($var, $needle) !== false;
}));
if(!empty($return)){
   // do something
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...