簡體   English   中英

Laravel session 中的多維數組,查找,覆蓋

[英]Laravel multidimensional array in session , finding , overwriting

我想在 session 中保留多維數組:

    $preBookDataToCompare = [];
    $preBookDataToCompare['preBookHash'] = $this->hashString($dataToHash);
    $preBookDataToCompare['user_id'] = $user_id;
    $preBookDataToCompare['item_id'] = $item_id;
    $preBookDataToCompare['start_date'] = $start_date->toDateString();
    $preBookDataToCompare['end_date'] = $end_date->toDateString();

Session::push('preBookDataToCompare', $preBookDataToCompare);

用戶打開頁面后,將生成數組並將其添加到 session。 他可能會打開帶有 diff item_id 或日期的新 TAB... 那么如何在 session 中檢查該數組:

  1. 如果設置:user_id && item_id && start_date && end_date EXIST?
  2. 如果不存在如何使用這些新值將新數組添加到該多數組?
  3. 如果 YES 存在,如何僅覆蓋數組中所選數組的 ['preBookHash']?

dd(Session::get("preBookDataToCompare")); 顯示:

  0 => array:5 [▼
    "preBookHash" => "c900cf028634f1d00005c6aad98be406"
    "user_id" => "a9eac834-7e11-4892-accd-50cd2386c3cc"
    "item_id" => "4a69e17e-7023-4a9d-9c6b-25bc73b7e0c3"
    "start_date" => "2021-03-25"
    "end_date" => "2021-03-31"
  ]
  1 => array:5 [▼
    "preBookHash" => "62bf5756b311b2d2b1cada8d9fe997e2"
    "user_id" => "a9eac834-7e11-4892-accd-50cd2386c3cc"
    "item_id" => "21eeccd9-cc13-4ee7-8432-e7f83792cdfd"
    "start_date" => "2021-03-25"
    "end_date" => "2021-03-31"
  ]
  2 => array:5 [▼
    "preBookHash" => "c900cf028634f1d00005c6aad98be406"
    "user_id" => "a9eac834-7e11-4892-accd-50cd2386c3cc"
    "item_id" => "4a69e17e-7023-4a9d-9c6b-25bc73b7e0c3"
    "start_date" => "2021-03-25"
    "end_date" => "2021-03-31"
  ]
]```

[0] and [2] are dubled :(
Session::push('preBookDataToCompare', $preBookDataToCompare);
I know that PUSH is append new array.
How to make it checks if values(dataset) exists , if yes overwrite , if not add new one , but prevent dubbles. ?

--------------------------------------------------------
WORKING SOLUTION : (thx to : Mihir Bhende )

        $preBookDataToCompare = [];
        $preBookDataToCompare['preBookHash'] = $this->hashString($dataToHash);
        $preBookDataToCompare['user_id'] = $user_id;
        $preBookDataToCompare['item_id'] = $item_id;
        $preBookDataToCompare['start_date'] = $start_date->toDateString();
        $preBookDataToCompare['end_date'] = $end_date->toDateString();

        $newItem = [
            'user_id' => $user_id,
            'item_id' => $item_id,
            'start_date' => $start_date->toDateString(),
            'end_date' => $end_date->toDateString()
        ];
        $newHash = $this->hashString($dataToHash);

        // Get existing session data
        $sessionData = collect(Session::get('preBookDataToCompare'));

        // Check if new item already exists matching key value pairs
        $alreadyExists = $sessionData->contains(function($value) use($newItem, $newHash){
            $newItem['preBookHash'] = $newHash ;
            return $newItem == $value;
        });

        // Add if item does not exist
        if(!$alreadyExists){
            $newItem['preBookHash'] = $this->hashString($dataToHash);
            $sessionData->push($newItem);
        }

        Session::put('preBookDataToCompare', $sessionData->toArray());

您可以使用 laravel 的名為contains()的收集方法,它可以關閉。 您也可以執行 foreach 並為此使用普通的 PHP。 我更喜歡收藏,因此您不必檢查 session 值是否為空。

<?php 

$newItem = [
    'someKey' => 'somevalue',
    'otherkey' => 'othervalue'
];
// Get existing session data
$sessionData = collect($session->get('preBookDataToCompare'));

// Check if new item already exists matching key value pairs
$alreadyExists = $sessionData->contains(function($value) use($newItem){
    
    return $newItem == $value;
});

// Add if item does not exist
if(!$alreadyExists){
    $sessionData->push($newItem);
    session()->put('preBookDataToCompare', $sessionData->toArray());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM