Проверьте, совпадают ли значения в массиве, если не сохранены как разные порядки в php - PullRequest
1 голос
/ 30 апреля 2019

Я публикую этот вопрос, так как не нашел решения при поиске здесь. Вот мой вопрос

У меня есть массив, поступающий после отправки данных со страницы просмотра, это список продуктов, которые пользователь выбрал для бронирования определенных дат (start_date и end_date). как будто он мог выбрать 3 разных товара в одну и ту же дату или все 3 товара в разные даты, даты начала и возврата.

Теперь у меня есть массив, в котором у меня есть все продукты, выбранные пользователем с start_date и end_date и другой информацией, связанной с продуктом.

Прежде чем хранить эти продукты как ЗАКАЗЫ, мне нужно проверить

  1. Если несколько продуктов имеют одинаковые start_date и end_date, тогда он становится один заказ .

  2. Если несколько продуктов имеют разные start_date и end_date, то становится разных заказов .

Теперь, как я буду проверять, имеют ли эти продукты одинаковые start_date и end_date или разные?

например .. это массив

 Array
(
[0] => Array
    (
        [product_id] => 15
        [start_date] => 2019-05-15
        [end_date] => 2019-05-16
        [status] => in_stock
    )

[1] => Array
    (
        [product_id] => 16
        [start_date] => 2019-05-15
        [end_date] => 2019-05-16
        [status] => out_of_stock
    )

[2] => Array
    (
        [product_id] => 17
        [start_date] => 2019-05-17
        [end_date] => 2019-05-18
        [status] => in_stock
    )
 )

Это 3 разных товара, здесь 2 товара забронированы на одну и ту же дату product_id [15,16] -> поэтому становится один заказ .

И другой product_id номер 17 становится одним вторым заказом.

Редактировать ...

Я добавил статус в массив, скажем, у меня есть 2 заказа на одну и ту же дату product_id [15,16], теперь он должен сортироваться по двум условиям,

  1. Если несколько ордеров имеют одинаковые start_date и end_date, то он становится единичным ордером / массивом, чего я достиг, используя принятый ответ.

  2. Теперь, скажем, после сортировки я получаю массив, в котором у меня есть 2 разных продукта, один из которых in_stock , а другой out_of_stock , теперь он снова должен стать двумя разными заказы.

Пожалуйста, дайте какое-нибудь решение, так как я застрял здесь.

Ответы [ 2 ]

2 голосов
/ 30 апреля 2019

Вы можете группировать по массиву с одинаковыми ключами, которые в вашем случае являются начальной и конечной датой.Может быть, что-то вроде этого:

$data = array(); // this is your array
$result = array();
foreach ($data as $element) {
    /* this will create an array that have start and end date as the key. 
    So, order with same start and end date will be grouped as 1.*/
    $result[$element['start_date']." to ".$element['end_date']][] = $element;
}

print_r($result); // do what you want

оригинальные коды из этого ответа .

1 голос
/ 30 апреля 2019

array_walk () - Применить пользовательскую функцию к каждому члену массива

Вы можете использовать array_walk и перебирать array для группировки arrays по start_date. $arr это ваш массив.

$res = [];
array_walk($arr, function($v, $k) use (&$arr,&$res){
  $nextKey = array_key_exists($k+1, $arr) ? ($k+1) : '';
  if(!empty($nextKey) && 
     $v['start_date'] == $arr[$nextKey]['start_date'] &&
     $v['end_date'] == $arr[$nextKey]['end_date']
  ){
     $res[] = [$v, $arr[$nextKey]];
     unset($arr[$nextKey]);
  }else{
     $res[] = [$v];
  }  
});
echo '<pre>';
print_r($res);

Для общего количества заказа используйте count($res)

...