0

私はかなり単純な 2 次元配列を持っています。内部配列の 1 つに値が存在するかどうかを調べる関数を作成しようとしています。それはそれほど難しいことではありません。問題は、見つかったら内部配列全体を削除する必要があることです。それが私が困っていることです。foreach ループを使用して行うことは不可能のようです。

とにかく、ここに配列があります。ありがとう!

$booksInCart = Array (Array ('bookId' => 344, 'quantity' => 1), 
             Array ('bookId' => 54, 'quantity' => 1), 
             Array ('bookId' => 172, 'quantity' => 2), 
              Array ('bookId' => 3, 'quantity' => 1)
);
4

4 に答える 4

1
// assume you want to delete bookId with 54.
$bookId = 54;
$booksInCart = array_filter($booksInCart, function ($var) use ($bookId) {
  return $var['bookId'] !== $bookId;
});
于 2013-09-04T02:48:11.487 に答える
1

foreachキーと値でループを使用します。unset()サブ配列へのキーを使用...

foreach ($booksInCart as $key => $sub) {
    if ($sub['bookId'] == 172) {
        unset($booksInCart[$key]);
    }
}
于 2013-09-04T02:50:02.690 に答える
1

次のようなものを試してください:

<?php
//Your cart array
$booksInCart = Array (
    Array ('bookId' => 344, 'quantity' => 1),
    Array ('bookId' => 54, 'quantity' => 1),
    Array ('bookId' => 172, 'quantity' => 2),
    Array ('bookId' => 3, 'quantity' => 1)
);

//User function to rebuild the array leaving out the bookID you want removed
function delete_book_from_cart($bookID, $haystack){
    $ret = array();
    foreach($haystack as $key=>$item){
        if($item['bookId'] == $bookID) continue;
        $ret[$key]=$item;
    }
    return $ret;
}

//Use like so
$booksInCart = delete_book_from_cart(172, $booksInCart);

/* Result
Array
(
    [0] => Array
        (
            [bookId] => 344
            [quantity] => 1
        )

    [1] => Array
        (
            [bookId] => 54
            [quantity] => 1
        )

    [3] => Array
        (
            [bookId] => 3
            [quantity] => 1
        )

)

*/
print_r($booksInCart);
?>

同じメソッドを使用して、本の数量を更新できます。

//User function to rebuild the array updating the qty you want changed
function update_book_in_cart($bookID, $qty, $haystack){
    $ret = array();
    foreach($haystack as $key=>$item){
        if($item['bookId'] == $bookID) $item['quantity'] = $qty;
        $ret[$key]=$item;
    }
    return $ret;
}

等々

于 2013-09-04T02:57:44.480 に答える
0

できることは、内側の配列のインデックスもループに格納し、値が見つかった場合は、そのインデックスを使用して外側の配列から削除することです。何かのようなもの:

foreach ($booksInCart as $id => $inner) {
    // Second foreach loop because you didn't specify which value you're checking
    // and I want to insure complete thoroughness
    foreach ($inner as $key => $value) {
        if ($key == $requiredkey && $value == $requiredvalue) {
            unset($booksInCart($id));
        }
    }
}
于 2013-09-04T02:48:22.140 に答える