Сравните 2 массива с array_diff

0

У меня есть два массива, которые мне нужно сравнить:

Первый массив содержит zipcodes качестве keys и dates как values:

Array ( [1000] => Array ( [0] => 2014-12-01 am [1] => 2014-12-01 pm [2] => 2014-12-05 am [3] => 2014-12-05 pm [4] => 2014-12-08 am [5] => 2014-12-08 pm [6] => 2014-12-12 am [7] => 2014-12-12 pm [8] => 2014-12-15 am [9] => 2014-12-15 pm [10] => 2014-12-19 am [11] => 2014-12-19 pm [12] => 2014-12-22 am [13] => 2014-12-22 pm ) [1020] => Array ( [0] => 2014-12-01 am [1] => 2014-12-01 pm [2] => 2014-12-02 am [3] => 2014-12-02 pm [4] => 2014-12-05 am [5] => 2014-12-05 pm [6] => 2014-12-08 am [7] => 2014-12-08 pm [8] => 2014-12-09 am [9] => 2014-12-09 pm [10] => 2014-12-12 am [11] => 2014-12-12 pm [12] => 2014-12-15 am [13] => 2014-12-15 pm [14] => 2014-12-16 am [15] => 2014-12-16 pm [16] => 2014-12-19 am [17] => 2014-12-22 am [18] => 2014-12-22 pm [19] => 2014-12-23 am [20] => 2014-12-23 pm ) (...) ) 

А затем второй массив имеет даты, которые хранятся как минимум 4 раза в базе данных, например, в этом примере:

Array ( [0] => 2014-12-01 pm [1] => 2014-12-12 am )

Я пытаюсь использовать array_diff для создания нового массива без этих дат, но он не работает.

Что мне не хватает? Любые идеи, как сделать эту работу?

заранее спасибо

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

Здесь полный код

global $woocommerce;

$dates = array(
    '1000' => array('2014-12-01 am', '2014-12-01 pm', '2014-12-05 am', '2014-12-05 pm', '2014-12-08 am', '2014-12-08 pm', '2014-12-12 am', '2014-12-12 pm', '2014-12-15 am', '2014-12-15 pm', '2014-12-19 am', '2014-12-19 pm', '2014-12-22 am','2014-12-22 pm'),
    '1020' => array('2014-12-01 am', '2014-12-01 pm', '2014-12-02 am', '2014-12-02 pm', '2014-12-05 am', '2014-12-05 pm', '2014-12-08 am', '2014-12-08 pm', '2014-12-09 am', '2014-12-09 pm', '2014-12-12 am', '2014-12-12 pm', '2014-12-15 am', '2014-12-15 pm', '2014-12-16 am', '2014-12-16 pm', '2014-12-19 am', '2014-12-22 am', '2014-12-22 pm', '2014-12-23 am', '2014-12-23 pm'),
    '1030' => array('2014-12-05 am', '2014-12-05 pm', '2014-12-12 am', '2014-12-12 pm', '2014-12-19 am', '2014-12-19 pm'),
    '1030' => array('2014-12-05 am', '2014-12-05 pm', '2014-12-12 am', '2014-12-12 pm', '2014-12-19 am', '2014-12-19 pm'),
    '1040' => array('2014-12-04 am', '2014-12-04 pm', '2014-12-11 am', '2014-12-11 pm', '2014-12-18 am', '2014-12-18 pm'),
    '1050' => array('2014-12-03 am', '2014-12-03 pm', '2014-12-10 am', '2014-12-10 pm', '2014-12-17 am', '2014-12-17 pm'),
    '1060' => array('2014-12-03 am', '2014-12-03 pm', '2014-12-10 am', '2014-12-10 pm', '2014-12-17 am', '2014-12-17 pm'),
    '1070' => array('2014-12-02 am', '2014-12-02 pm', '2014-12-09 am', '2014-12-09 pm', '2014-12-16 am', '2014-12-16 pm', '2014-12-23 am', '2014-12-23 pm'),
    '1080' => array('2014-12-02 am', '2014-12-02 pm', '2014-12-09 am', '2014-12-09 pm', '2014-12-16 am', '2014-12-16 pm', '2014-12-23 am', '2014-12-23 pm'),
    '1081' => array('2014-12-02 am', '2014-12-02 pm', '2014-12-09 am', '2014-12-09 pm', '2014-12-16 am', '2014-12-16 pm', '2014-12-23 am', '2014-12-23 pm'),
    '1082' => array('2014-12-02 am', '2014-12-02 pm', '2014-12-09 am', '2014-12-09 pm', '2014-12-16 am', '2014-12-16 pm', '2014-12-23 am', '2014-12-23 pm'),
    '1083' => array('2014-12-02 am', '2014-12-02 pm', '2014-12-09 am', '2014-12-09 pm', '2014-12-16 am', '2014-12-16 pm', '2014-12-23 am', '2014-12-23 pm'),
    '1090' => array('2014-12-02 am', '2014-12-02 pm', '2014-12-09 am', '2014-12-09 pm', '2014-12-16 am', '2014-12-16 pm', '2014-12-23 am', '2014-12-23 pm'),
    '1120' => array('2014-12-01 am', '2014-12-01 pm', '2014-12-05 am', '2014-12-05 pm', '2014-12-08 am', '2014-12-08 pm', '2014-12-12 am', '2014-12-12 pm', '2014-12-15 am', '2014-12-15 pm', '2014-12-19 am', '2014-12-19 pm', '2014-12-22 am', '2014-12-22 pm'),
    '1130' => array('2014-12-01 am', '2014-12-01 pm', '2014-12-08 am', '2014-12-08 pm', '2014-12-15 am', '2014-12-15 pm', '2014-12-22 am', '2014-12-22 pm'),
    '1140' => array('2014-12-05 am', '2014-12-05 pm', '2014-12-12 am', '2014-12-12 pm', '2014-12-19', 'am'),
    '1150' => array('2014-12-04 am', '2014-12-04 pm', '2014-12-11 am', '2014-12-11 pm', '2014-12-18 am', '2014-12-18 pm'),
    '1160' => array('2014-12-04 am', '2014-12-04 pm', '2014-12-11 am', '2014-12-11 pm', '2014-12-18 am', '2014-12-18 pm'),
    '1170' => array('2014-12-03 am', '2014-12-03 pm', '2014-12-10 am', '2014-12-10 pm', '2014-12-17 am', '2014-12-17 pm'),
    '1180' => array('2014-12-03 am', '2014-12-03 pm', '2014-12-10 am', '2014-12-10 pm', '2014-12-17 am', '2014-12-17 pm'),
    '1190' => array('2014-12-03 am', '2014-12-03 pm', '2014-12-10 am', '2014-12-10 pm', '2014-12-17 am', '2014-12-17 pm'),
    '1200' => array('2014-12-04 am', '2014-12-04 pm', '2014-12-11 am', '2014-12-11 pm', '2014-12-18 am', '2014-12-18 pm'),
    '1210' => array('2014-12-05 am', '2014-12-05 pm', '2014-12-12 am', '2014-12-12 pm', '2014-12-19 am', '2014-12-19 pm'),
    '1620' => array('2014-12-03 am', '2014-12-03 pm', '2014-12-10 am', '2014-12-10 pm', '2014-12-17 am', '2014-12-17 pm'),
    '1630' => array('2014-12-03 am', '2014-12-03 pm', '2014-12-10 am', '2014-12-10 pm', '2014-12-17 am', '2014-12-17 pm'),
    '1650' => array('2014-12-03 am', '2014-12-03 pm', '2014-12-10 am', '2014-12-10 pm', '2014-12-17 am', '2014-12-17 pm'),
    '1702' => array('2014-12-02 am', '2014-12-02 pm', '2014-12-09 am', '2014-12-09 pm', '2014-12-16 am', '2014-12-16 pm', '2014-12-23 am', '2014-12-23 pm'),
    '1780' => array('2014-12-02 am', '2014-12-02 pm', '2014-12-09 am', '2014-12-09 pm', '2014-12-16 am', '2014-12-16 pm', '2014-12-23 am', '2014-12-23 pm'),
    '1800' => array('2014-12-01 am', '2014-12-01 pm', '2014-12-08 am', '2014-12-08 pm', '2014-12-15 am', '2014-12-15 pm', '2014-12-22 am', '2014-12-22 pm'),
    '1850' => array('2014-12-01 am', '2014-12-01 pm', '2014-12-08 am', '2014-12-08 pm', '2014-12-15 am', '2014-12-15 pm', '2014-12-22 am', '2014-12-22 pm'),
    '1853' => array('2014-12-01 am', '2014-12-01 pm', '2014-12-08 am', '2014-12-08 pm', '2014-12-15 am', '2014-12-15 pm', '2014-12-22 am', '2014-12-22 pm'),
    '1930' => array('2014-12-04 am', '2014-12-04 pm', '2014-12-11 am', '2014-12-11 pm', '2014-12-18 am', '2014-12-18 pm'),
    '1932' => array('2014-12-04 am', '2014-12-04 pm', '2014-12-11 am', '2014-12-11 pm', '2014-12-18 am', '2014-12-18 pm'),
    '1950' => array('2014-12-04 am', '2014-12-04 pm', '2014-12-11 am', '2014-12-11 pm', '2014-12-18 am', '2014-12-18 pm'),
    '1970' => array('2014-12-04 am', '2014-12-04 pm', '2014-12-11 am', '2014-12-11 pm', '2014-12-18 am', '2014-12-18 pm')
);  

$args = array(
    'post_type' => 'shop_order',
    'post_status' => 'publish',
    'posts_per_page' => -1,
    'tax_query' => array(
        array(
            'taxonomy' => 'shop_order_status',
            'field' => 'slug',
            'terms' => array('pending', 'processing', 'completed', 'on-hold')
        )
    )
);

$loop = new WP_Query($args);

$delivery_dates = array();

while ($loop->have_posts()) : $loop->the_post();
    $order_id = $loop->post->ID;

    $order = new WC_Order($order_id);

    if(array_key_exists($order->billing_delivery_date, $delivery_dates))
        $delivery_dates[$order->billing_delivery_date]++;
    else
        $delivery_dates[$order->billing_delivery_date] = 1;

endwhile;

$max_deliveries = 4;
$result = array_filter(
    $delivery_dates, function ($value) use($max_deliveries) {
        return ($value >= $max_deliveries);
    }
);

$reverse = array_flip($result);

$delivery_dates_db = array_values($reverse);

$new_dates = array_diff($dates, $delivery_dates_db);

print_r($new_dates);
Теги:
arrays

1 ответ

0
Лучший ответ

Итак, на данный момент у вас ненужный массив вложен.

Взгляните на первую запись:

<?php
$dates = array(
'1000' => array(
    array('2014-12-01 am', '2014-12-01 pm', '2014-12-05 am', '2014-12-05 pm', '2014-12-08 am', '2014-12-08 pm', '2014-12-12 am', '2014-12-12 pm', '2014-12-15 am', '2014-12-15 pm', '2014-12-19 am', '2014-12-19 pm', '2014-12-22 am','2014-12-22 pm')
)
....

Вы могли бы так:

<?php
$dates = array(
'1000' => array('2014-12-01 am', '2014-12-01 pm', '2014-12-05 am', '2014-12-05 pm', '2014-12-08 am', '2014-12-08 pm', '2014-12-12 am', '2014-12-12 pm', '2014-12-15 am', '2014-12-15 pm', '2014-12-19 am', '2014-12-19 pm', '2014-12-22 am','2014-12-22 pm'),
....

Если вы планируете делать array_diff, вам придется перебирать $ date для сравнения каждого значения внутри него. (Эти коды работают только без вложенного массива).

<?php
foreach($dates as $key => value){
  $dates[$key] = array_diff($value, $delivery_dates_db);
}

Этот код должен работать с вложенным массивом.

<?php
foreach($dates as $key => value){
  $dates[$key] = array_diff($value[0], $delivery_dates_db);
}

Я не уверен, почему вы вложили другой массив.

  • 0
    Спасибо человек, я только что удалил вложенные массивы и использовал ваше первое решение, кажется, что массив создан правильно и без дат, полученных из БД!
  • 0
    Я рад, что это работает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню