如果存在相同的数字数组键,则增加一个增量
Add one increment if same numeric array key exists
我有一个以下数组,我需要根据键值对这个数组进行排序。如果所有数字键都不同,我写了一个代码并得到了完美的结果。
$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
)
正如我在评论中所说,这看起来像 XY problem。您实际上不需要增加键,您需要保留所有值(包括键重复时)并按键对它们进行排序。
我假设当两个或多个项目具有相同的键时,它们来自数据库的顺序必须保留在最终列表中。
目标是:
- 保留所有值;
- 按键排序;
- 当两个或多个项目具有相同的键时,保持它们到达的顺序。
考虑到这一点,一个可能的解决方案是在 $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);
A 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()
and array_merge()
:
以更紧凑的方式编写它
$new = array_reduce($order, 'array_merge', array());
print_r($new);
输出为:
Array
(
[0] => 216
[1] => 223
[2] => 215
[3] => 214
)
注意原始键丢失,新列表按顺序索引。
我有一个以下数组,我需要根据键值对这个数组进行排序。如果所有数字键都不同,我写了一个代码并得到了完美的结果。
$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
)
正如我在评论中所说,这看起来像 XY problem。您实际上不需要增加键,您需要保留所有值(包括键重复时)并按键对它们进行排序。
我假设当两个或多个项目具有相同的键时,它们来自数据库的顺序必须保留在最终列表中。
目标是:
- 保留所有值;
- 按键排序;
- 当两个或多个项目具有相同的键时,保持它们到达的顺序。
考虑到这一点,一个可能的解决方案是在 $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);
A 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()
and array_merge()
:
$new = array_reduce($order, 'array_merge', array());
print_r($new);
输出为:
Array
(
[0] => 216
[1] => 223
[2] => 215
[3] => 214
)
注意原始键丢失,新列表按顺序索引。