2017-02-10 1 views
1

У меня есть массив как этотПолучить элемент массива, имеющий наибольшее значение времени даты из многомерного массива

Array 
(
    [4621162015] => Array 
     (
      [0] => Array 
       (
        [itemId] => 220929621668 
        [itemName] => Teak Protector - 1ltr water-based teak wood protector - maintain honey colour! 
        [itemPrice] => 24.99 
        [itemCurrencySign] => £ 
        [itemGalleryUrl] => http://i.ebayimg.com/00/s/NjU1WDgwMA==/z/qI8AAOSwt7pXMKHB/$_1.JPG?set_id=880000500F 
        [itemImages] => Array 
         (
          [0] => http://i.ebayimg.com/00/s/NjU1WDgwMA==/z/qI8AAOSwt7pXMKHB/$_1.JPG?set_id=880000500F 
          [1] => http://i.ebayimg.com/00/s/MTEzMVgxNjAw/z/70cAAOSwcL5XMKC6/$_1.JPG?set_id=880000500F 
         ) 

        [itemQuantity] => 257 
        [itemStartTime] => 2012-01-10T16:40:03.000Z 
        [itemEndTime] => 2017-02-12T16:40:03.000Z 
        [itemUrl] => http://www.ebay.com/itm/Teak-Protector-1ltr-water-based-teak-wood-protector-maintain-honey-colour-/220929621668 
        [itemCategoryId] => 4621162015 
        [itemCategoryUrl] => http://stores.ebay.co.uk/JATI-Teak-and-Woven-Furniture/_i.html?_fsub=4621162015 
       ) 

      [1] => Array 
       (
        [itemId] => 220929626118 
        [itemName] => Teak Patinizer - 1ltr patinizer to maintain the silver-patina or weathered look! 
        [itemPrice] => 24.99 
        [itemCurrencySign] => £ 
        [itemGalleryUrl] => http://i.ebayimg.com/00/s/NjU1WDgwMA==/z/1bwAAOSwYmZXMKE-/$_1.JPG?set_id=880000500F 
        [itemImages] => Array 
         (
          [0] => http://i.ebayimg.com/00/s/NjU1WDgwMA==/z/1bwAAOSwYmZXMKE-/$_1.JPG?set_id=880000500F 
          [1] => http://i.ebayimg.com/00/s/MTEzMVgxNjAw/z/A~4AAOSwubRXMKE8/$_1.JPG?set_id=880000500F 
         ) 

        [itemQuantity] => 202 
        [itemStartTime] => 2012-01-10T16:49:41.000Z 
        [itemEndTime] => 2017-02-12T16:49:41.000Z 
        [itemUrl] => http://www.ebay.com/itm/Teak-Patinizer-1ltr-patinizer-maintain-silver-patina-weathered-look-/220929626118 
        [itemCategoryId] => 4621162015 
        [itemCategoryUrl] => http://stores.ebay.co.uk/JATI-Teak-and-Woven-Furniture/_i.html?_fsub=4621162015 
       ) 

      [2] => Array 
       (
        [itemId] => 220929631080 
        [itemName] => Teak Cleaner - 1ltr bring back the original colour of new teak/hardwood! 
        [itemPrice] => 19.5 
        [itemCurrencySign] => £ 
        [itemGalleryUrl] => http://i.ebayimg.com/00/s/NjU1WDgwMA==/z/HWIAAOSw8vZXMKGK/$_1.JPG?set_id=880000500F 
        [itemImages] => Array 
         (
          [0] => http://i.ebayimg.com/00/s/NjU1WDgwMA==/z/HWIAAOSw8vZXMKGK/$_1.JPG?set_id=880000500F 
          [1] => http://i.ebayimg.com/00/s/MTEzMVgxNjAw/z/u8kAAOSw3mpXMKGT/$_1.JPG?set_id=880000500F 
         ) 

        [itemQuantity] => 204 
        [itemStartTime] => 2012-01-10T16:59:50.000Z 
        [itemEndTime] => 2017-02-12T16:59:50.000Z 
        [itemUrl] => http://www.ebay.com/itm/Teak-Cleaner-1ltr-bring-back-original-colour-new-teak-hardwood-/220929631080 
        [itemCategoryId] => 4621162015 
        [itemCategoryUrl] => http://stores.ebay.co.uk/JATI-Teak-and-Woven-Furniture/_i.html?_fsub=4621162015 
       ) 

     ) 

    [8389242015] => Array 
     (
      [0] => Array 
       (
        [itemId] => 222388502715 
        [itemName] => New Folding Round Teak Picnic Table Wood Garden Premium 50cm Foldup Solid Sale 
        [itemPrice] => 33.33 
        [itemCurrencySign] => £ 
        [itemGalleryUrl] => http://i.ebayimg.com/00/s/NjU1WDgwMA==/z/bWcAAOSw4DJYiIOA/$_57.JPG?set_id=8800005007 
        [itemImages] => Array 
         (
          [0] => http://i.ebayimg.com/00/s/NjU1WDgwMA==/z/bWcAAOSw4DJYiIOA/$_57.JPG?set_id=8800005007 
          [1] => http://i.ebayimg.com/00/s/OTg1WDEwMDA=/z/kAoAAOSwo4pYiIOH/$_57.JPG?set_id=8800005007 
         ) 

        [itemQuantity] => 50 
        [itemStartTime] => 2017-01-25T12:00:13.000Z 
        [itemEndTime] => 2017-02-24T12:00:13.000Z 
        [itemUrl] => http://www.ebay.com/itm/New-Folding-Round-Teak-Picnic-Table-Wood-Garden-Premium-50cm-Foldup-Solid-Sale-/222388502715 
        [itemCategoryId] => 8389242015 
        [itemCategoryUrl] => http://stores.ebay.co.uk/JATI-Teak-and-Woven-Furniture/_i.html?_fsub=8389242015 
       ) 

     ) 
)  

и я хочу, чтобы получить последние два пункта на основе itemStartTime по всем пунктам, которые присутствуют внутри многомерного массива так окончательными массив будет выглядеть, как показано ниже

Array 
(
    [0] => Array 
     (
      [itemId] => 222388502715 
      [itemName] => New Folding Round Teak Picnic Table Wood Garden Premium 50cm Foldup Solid Sale 
      [itemPrice] => 33.33 
      [itemCurrencySign] => £ 
      [itemGalleryUrl] => http://i.ebayimg.com/00/s/NjU1WDgwMA==/z/bWcAAOSw4DJYiIOA/$_57.JPG?set_id=8800005007 
      [itemImages] => Array 
       (
        [0] => http://i.ebayimg.com/00/s/NjU1WDgwMA==/z/bWcAAOSw4DJYiIOA/$_57.JPG?set_id=8800005007 
        [1] => http://i.ebayimg.com/00/s/OTg1WDEwMDA=/z/kAoAAOSwo4pYiIOH/$_57.JPG?set_id=8800005007 
       ) 

      [itemQuantity] => 50 
      [itemStartTime] => 2017-01-25T12:00:13.000Z 
      [itemEndTime] => 2017-02-24T12:00:13.000Z 
      [itemUrl] => http://www.ebay.com/itm/New-Folding-Round-Teak-Picnic-Table-Wood-Garden-Premium-50cm-Foldup-Solid-Sale-/222388502715 
      [itemCategoryId] => 8389242015 
      [itemCategoryUrl] => http://stores.ebay.co.uk/JATI-Teak-and-Woven-Furniture/_i.html?_fsub=8389242015 
     ) 

     [1] => Array 
       (
        [itemId] => 220929631080 
        [itemName] => Teak Cleaner - 1ltr bring back the original colour of new teak/hardwood! 
        [itemPrice] => 19.5 
        [itemCurrencySign] => £ 
        [itemGalleryUrl] => http://i.ebayimg.com/00/s/NjU1WDgwMA==/z/HWIAAOSw8vZXMKGK/$_1.JPG?set_id=880000500F 
        [itemImages] => Array 
         (
          [0] => http://i.ebayimg.com/00/s/NjU1WDgwMA==/z/HWIAAOSw8vZXMKGK/$_1.JPG?set_id=880000500F 
          [1] => http://i.ebayimg.com/00/s/MTEzMVgxNjAw/z/u8kAAOSw3mpXMKGT/$_1.JPG?set_id=880000500F 
         ) 

        [itemQuantity] => 204 
        [itemStartTime] => 2012-01-10T16:59:50.000Z 
        [itemEndTime] => 2017-02-12T16:59:50.000Z 
        [itemUrl] => http://www.ebay.com/itm/Teak-Cleaner-1ltr-bring-back-original-colour-new-teak-hardwood-/220929631080 
        [itemCategoryId] => 4621162015 
        [itemCategoryUrl] => http://stores.ebay.co.uk/JATI-Teak-and-Woven-Furniture/_i.html?_fsub=4621162015 
       ) 



) 

ТВЕН я полностью потерял на этом не получает ключ другого, то разбора сортирует каждый аут и с помощью Еогеаспа, но это было бы слишком медленными для больших массивов

любая помощь на этом была бы действительно потрясающей!

Мое решение до сих пор это переставляя каждый массив и готовит новый массив, который будет только держать предметы, а затем сортировать их, как этот

foreach ($storeItemsArray as $key => $value) 
       foreach ($value as $key_sub => $value_sub) 
        $itemsArray[]=$value_sub; 



      // sort items and get the latest first 
      usort($itemsArray, function($a, $b) { 
         $ad = new DateTime($b['itemStartTime']); 
         $bd = new DateTime($a['itemStartTime']); 

         if ($ad == $bd) { 
         return 0; 
         } 

        return $ad < $bd ? -1 : 1; 
      }); 

что-то лучше, то просто дать мне головы я просто обеспокоен его будет медленным для массивов, содержащих 400 или 500 элементов :(

ответ

1

Это технически не используется foreach() и может быть использовано. Все, что я сделал, это удалить 1-е измерение, чтобы вы могли легко сортировать, используя call_user_func_array() с array_merge().

$newArr = call_user_func_array('array_merge', $arr); //To remove 1st Dimension 

usort($newArr, function($x, $y){ 

    $x = strtotime($x['itemStartTime']); 
    $y = strtotime($y['itemStartTime']); 

    if($x>$y){ 

     return 0; 
    } 

    return 1; 
}); 

var_dump(array_slice($newArr, 2)); 

Выход:

array(2) { 
    [0] => array(3) { 
     ["itemId"] => int(220929626118)["itemName"] => string(80) 
     "Teak Patinizer - 1ltr patinizer to maintain the silver-patina or weathered look!" ["itemStartTime"] => string(24) 
     "2012-01-10T16:49:41.000Z" 
    }[1] => array(3) { 
     ["itemId"] => int(220929621668)["itemName"] => string(78) 
     "Teak Protector - 1ltr water-based teak wood protector - maintain honey colour!" ["itemStartTime"] => string(24) 
     "2012-01-10T16:40:03.000Z" 
    } 
} 
+0

Thats выглядит обещанием, позвольте мне проверить и вернуться к вам !!!! –

0

Я знаю, что вы упоминаете, что foreach's будет слишком медленным для больших массивов - но если вы действительно не имеете дело с огромным количеством данных, это все еще путь, который я бы взял Это в основном относится к структуре вашего массива.

Сначала я объединил их всех в один массив, затем выполнил сортировку и вытащил верхние 2 элемента из отсортированного массива.

Я собираюсь предположить (на основе данных), что эти элементы изначально сгруппированы по категориям.

// $categoryItems = array(...) // This is your original array. 
$items = array() // An empty array for our items 

// Combine all items into one array. 
foreach($categoryItems as $category) { 
    foreach($category as $item) { 
     $items[] = $item; 
    } 
} 

// Sort items using a custom sort function 
$sortedItems = usort($items, "sortItems"); 

// This variable will contain your 2 items 
$latestItems = array_slice($sortedItems, 0, 2); 

function sortItems($a, $b) { 
    if ($a['itemStartTime'] == $b['itemStartTime']) { 
     return 0; 
    } 
    return ($a['itemStartTime'] < $b['itemStartTime']) ? -1 : 1; 
} 

Это непроверенный код - так что может потребоваться некоторые небольшие хитрости

+0

Да я думал так же, но я держать его в крайнем случае видеть мой выбор для моей версии кода, но он также имеет ту же логику, что и ваша :) –

0

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

<?php 

    function extract_top_dates($arr, $out_arr_len) { 
     $dates = array(); 
     foreach($arr as $key1 => $value1) { 
      foreach($value1 as $key2 => $value2) { 
       $dates[$value2['itemId']] = strtotime($value2['itemStartTime']); 
      } 
     } 

     arsort($dates); 
     $top_dates = array_slice($dates, 0, $out_arr_len, true); 
     $arr_new = array(); 

     foreach($arr as $key1 => $value1) { 
      foreach($value1 as $key2 => $value2) { 
       if(in_array($value2['itemId'], array_keys($top_dates))) { 
        $arr_new[] = $value2; 
       } 
      } 
     } 

     rsort($arr_new); 

     return $arr_new; 
    } 

    var_dump(extract_top_dates($arr, 2)); 

?> 

Надеюсь, это поможет!

Смежные вопросы