Добавьте один шаг, если существует такой же ключ числового массива

У меня есть следующий массив, и мне нужно отсортировать этот массив на основе значения ключа. Я написал код и получил отличный результат, если все цифровые клавиши разные.

$myarray_need_to_sort =Array
(
[13] => 214
[14] => 215
[15] => 216
[21] => 223
)

Вот мой код

$order = array();
foreach ($myarray_need_to_sort as $value){
$cat = Mage::getModel('catalog/category')->load($value);
$order[$cat->getTabOrder()] = $value;
}
ksort($order);
$sorted_order = array();
foreach ($order as $key=>$value)
{
$sorted_order[$key] = $value;
}

print_r($sorted_order);

$ cat-> getTabOrder () — это порядок сортировки, который я получаю из бэкэнда, и результат идеален

Array
(
[1] => 216
[2] => 223
[3] => 215
[4] => 214
)

Код прекрасно сортирует массив, но проблема в том, что если такой же ключ существует, т.е. кто-то добавил $ cat-> getTabOrder (), скажем, 2 и 2 для двух значений, то он удаляет один ключ. Мне нужно добавить один шаг для этого как

Array
(
[1] => 216
[2] => 223
[2] => 215 -- it should be 3 and 4 should be 5 but it is removing 2 from here
[4] => 214 -- should be 5
)

1

Решение

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

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

Цели:

  • сохранить все ценности;
  • сортировать их по ключам;
  • если два или более предметов имеют одинаковый ключ, сохраняйте порядок их прибытия.

Учитывая это, возможное решение состоит в том, чтобы сохранить $order, для каждого ключа список элементов, которые имеют этот ключ. Сортируйте список по ключам, а затем перебирайте массив, используя два вложенных цикла foreach, или выравнивайте его перед использованием.

Код:

// $order[$key] is the list of $cat items having $cat->getTabOrder() == $key
$order = array();
foreach ($myarray_need_to_sort as $value){
$cat = Mage::getModel('catalog/category')->load($value);
$key = $cat->getTabOrder();
if (! array_key_exists($key, $order)) {
// This is the first $cat having $key as tab order
// Create a new list of $key
$order[$key] = array();
}
// Add $value to the list of is $key (tab order)
$order[$key][] = $value;
}
// Sort the outer array by keys
ksort($order);

print_r($order) должно отображать что-то вроде:

Array
(
[1] => Array
(
[0] => 216
)
[2] => Array
(
[0] => 223
[1] => 215
)
[4] => Array
(
[0] => 214
)
)

Теперь вы можете извлечь значения из массива путем итерации по каждому подмассиву:

foreach ($order as $key => $list) {
foreach ($list as $value) {
echo('$key='.$key.': $value='.$value."\n");
}
}

Он отображает:

$key=1: $value=216
$key=2: $value=223
$key=2: $value=215
$key=4: $value=214

Если вам больше не нужны ключи, все, что вам нужно, это список $value после сортировки вы можете поместить значения в новый список в двойном foreach выше (вместо отображения их).

Или вы можете написать его более компактно, используя array_reduce() а также array_merge():

$new = array_reduce($order, 'array_merge', array());
print_r($new);

Выход:

Array
(
[0] => 216
[1] => 223
[2] => 215
[3] => 214
)

Обратите внимание, что исходные ключи потеряны, новый список индексируется последовательно.

0

Другие решения

Других решений пока нет …