Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:重新排序关联数组_Php - Fatal编程技术网

PHP:重新排序关联数组

PHP:重新排序关联数组,php,Php,在php中,我希望能够通过将元素移动到数组中的某些位置来重新排列关联数组。不需要排序,只是我选择的重新排序 例如,假设我有一个关联数组,如下所示: array( 'a' => 'Element A', 'b' => 'Element B', 'c' => 'Element C', ); 在一种情况下,我可能想把C移到B之前,结果如下: array( 'a' => 'Element A', 'c' => 'Element C', 'b' => 'E

在php中,我希望能够通过将元素移动到数组中的某些位置来重新排列关联数组。不需要排序,只是我选择的重新排序

例如,假设我有一个关联数组,如下所示:

array(
 'a' => 'Element A',
 'b' => 'Element B',
 'c' => 'Element C',
);
在一种情况下,我可能想把C移到B之前,结果如下:

array(
 'a' => 'Element A',
 'c' => 'Element C',
 'b' => 'Element B',
);
array(
 'c' => 'Element C',
 'a' => 'Element A',
 'b' => 'Element B',
);
或者在另一种情况下,我可能希望将C移到A之前,并得到以下结果:

array(
 'a' => 'Element A',
 'c' => 'Element C',
 'b' => 'Element B',
);
array(
 'c' => 'Element C',
 'a' => 'Element A',
 'b' => 'Element B',
);
我想展示的是一个简单的方法,可以说“嘿,我想把这个数组元素移到另一个数组元素之前”或者“嘿,我想把这个数组元素移到另一个数组元素之后”

希望这是有意义的


感谢所有愿意帮助我进行自定义排序的人。例如,您可以创建一个按所需键顺序排列的数组,然后将值与之关联。例如:

$input = array("a"=>"Element A","b"=>"Element B","c"=>"Element C");
$order = array("c","a","b");
$out = array();
foreach($order as $k) {
    $out[$k] = $input[$k];
}

$out
中的元素将按指定的顺序排列。

如果您想交换两个值,可以创建如下函数:

function array_swap($key1, $key2, $array) {
        $newArray = array ();
        foreach ($array as $key => $value) {
            if ($key == $key1) {
                $newArray[$key2] = $array[$key2];
            } elseif ($key == $key2) {
                $newArray[$key1] = $array[$key1];
            } else {
                $newArray[$key] = $value;
            }
        }
        return $newArray;
    }

array\u splice
不幸的是,它不适用于关联数组,因此这里有一点混乱:

$keys = array_keys($arr);
$values = array_values($arr);

$keyIndex = array_search($someKey, $keys);
array_splice($keys, $keyIndex, 1);
array_splice($values, $keyIndex, 1);

$insertIndex = 1;
array_splice($keys, $insertIndex, 0, array($someKey));
array_splice($values, $insertIndex, 0, array($arr[$someKey]));

$arr = array_combine($keys, $values);
嘿,我想在['b']之前移动['move me']。我只需要4行代码就可以做到

$i = 0; foreach($arr as &$val) $val = array('sort' => (++$i * 10), 'val' => $val);
$arr['move me']['sort'] = $arr['b']['sort'] - 5;
uasort($arr, function($a, $b) { return $a['sort'] > $b['sort']; });
foreach($arr as &$val) $val = $val['val'];



我制作了一个易于使用的函数:

function move_item(&$ref_arr, $key1, $move, $key2 = null)
{
  $arr = $ref_arr;
  if($key2 == null) $key2 = $key1;
  if(!isset($arr[$key1]) || !isset($arr[$key2])) return false;

  $i = 0; foreach($arr as &$val) $val = array('sort' => (++$i * 10), 'val' => $val);

  if(is_numeric($move))
  {
    if($move == 0 && $key1 == $key2) return true;
    elseif($move == 0) { $tmp = $arr[$key1]['sort']; $arr[$key1]['sort'] = $arr[$key2]['sort']; $arr[$key2]['sort'] = $tmp; }
    else $arr[$key1]['sort'] = $arr[$key2]['sort'] + ($move * 10 + ($key1 == $key2 ? ($move < 0 ? -5 : 5) : 0));
  }
  else
  {
    switch($move)
    {
      case 'up':     $arr[$key1]['sort'] = $arr[$key2]['sort'] - ($key1 == $key2 ? 15 : 5); break;
      case 'down':   $arr[$key1]['sort'] = $arr[$key2]['sort'] + ($key1 == $key2 ? 15 : 5); break;
      case 'top':    $arr[$key1]['sort'] = 5; break;
      case 'bottom': $arr[$key1]['sort'] = $i * 10 + 5; break;
      default: return false;
    }
  }
  uasort($arr, function($a, $b) { return $a['sort'] > $b['sort']; });
  foreach($arr as &$val) $val = $val['val'];
  $ref_arr = $arr;
  return true;
}


我希望这能帮助很多人,因为这是一个很棒的函数!:D

这里有很多困难的方法:)事实上,你可以利用
array\u slice()
的保留键功能


我在这里基于一个答案创建了一个函数,它接受要排序的assoc数组,加上应该重排序的键数组

// $data = array of assoc array
// $newKeysOrder = array("c","a","b");
function resort_assoc_array_by_keys($data, $newKeysOrder) {
  foreach($data as $v) {
    $out = [];
    foreach($newKeysOrder as $k) {
      $out[$k] = $v[$k];
    }  
    $new[] = $out;
  }
  return $new;
}

我最喜欢luky的答案,但它需要指定所有键。大多数情况下,您只需要在数组的开头订购一部分键。此函数将有助于:

函数重新排序\u关联\u数组(
$cur,//当前关联数组
$order//数组包含$cur中的有序(子集)键
) {
$result=[];
//第一次将已排序的键/值复制到结果数组
foreach($订单作为$key){
$result[$key]=$cur[$key];
//在原始数组中取消设置密钥
未设置($cur[$key]);
}
//…然后复制未按$order提供的所有剩余密钥
foreach($cur as$key=>$value){
$result[$key]=$value;
}
返回$result;
}
例如:

$assoc\u arr=[
“b”=>“bbb”,
“a”=>“aaa”,
‘c’=>‘ccc’,
'd'=>'ddd'
];
//假设我们想交换前两个键,并保持其余键不变
$assoc_arr=重新排序数组($assoc_arr,['a','b']);
//…钥匙的顺序现在是a、b、c、d

关联数组没有任何顺序。@DonCallisto:这完全是错误的。数组也是列表,因此最明确的顺序是定义良好的。如果数组是数字的,那么使用它会简单得多。例如
array\u splice
来做你想做的事情:是的,如果是数字的,那么解决方案就会简单:)这是我问的是堆栈溢出问题,因为它由于关联数组而变得复杂。这对我的问题不起作用。我需要将一个元素移动到另一个元素之前或之后。因此,我的方法将只获得两个键谢谢你的回答,但我还需要移动键,而不仅仅是值。我添加了这个,因此如果数组包含空值-$arr=array_-map(函数($v){return(is_-null($v))?“”:$v;},$arr);您认为有更好的方法吗?这是非常棒的,只要在我的项目中插入,并让它在第一次尝试时工作。
// $data = array of assoc array
// $newKeysOrder = array("c","a","b");
function resort_assoc_array_by_keys($data, $newKeysOrder) {
  foreach($data as $v) {
    $out = [];
    foreach($newKeysOrder as $k) {
      $out[$k] = $v[$k];
    }  
    $new[] = $out;
  }
  return $new;
}