4

我有一个形式的关联数组:

$input = array("one" => <class object1>,
               "two" => <class object2,
               ... //and so on);

$input 的键保证是唯一的。我还有一个方法叫做moveToHead($key)$input[$key]元素移动到这个关联数组的第 0 个位置。我有几个问题:

  1. 是否可以确定关联数组的索引?
  2. 如何将对应对的数组条目移动$key => $value到索引 0 并保持$key原样?
  3. 实现上述两点的最佳方法是什么?

我想为第二点(一个子解决方案)做array_flip,但后来发现array_flip只有当数组元素是int和string时才能做到。任何指针?

4

4 回答 4

1

关联数组的“索引”是关键。在数字索引数组中,“键”是索引号。

编辑:我收回它。PHP 的关联数组是有序的(就像其他语言中的 Ordered Maps 一样)。

但也许您真正想要的是关联数组的有序数组?

$input = array(array("one" => <class object1>),
               array("two" => <class object2>)
               //...
         );
于 2012-07-20T16:46:56.840 回答
1

使用调用的函数,array_keys您可以确定键的索引:

$keys = array_flip(array_keys($input));
printf("Index of '%s' is: %d\n", $key, $keys[$key]);

要在某个位置(例如开头)插入一个数组,有这个array_splice函数。因此,您可以创建要插入的数组,从旧位置删除值并将其拼接:

$key = 'two';
$value = $input[$key];
unset($input[$key]);    
array_splice($input, 0, 0, array($key => $value));

数组联合运算符可能会出现类似的情况,但这只是因为您想移到顶部:

$key = 'two';
$value = $input[$key];
unset($input[$key]);
$result = array($key => $value) + $input;

但我认为这可能比array_splice.

于 2012-07-20T16:55:55.540 回答
1

这是我想出的:

$arr = array('one' => 'Value1', 'two' => 'Value2', 'three' => 'Value3');

function moveToHead($array,$key) {
   $return = $array;
   $add_val = array($key => $return[$key]);
   unset($return[$key]);
   return $add_val + $return;
}

print_r(moveToHead($arr,'two'));

结果是

Array
(
    [two] => Value2
    [one] => Value1
    [three] => Value3
)

http://codepad.org/Jcb6ebxZ

于 2012-07-20T16:58:09.253 回答
0

您可以使用内部数组指针函数来做您想做的事情:

$input = array(
    "one"   => "element one",
    "two"   => "element two",
    "three" => "element three",
);
reset($input); // Move to first element.
echo key($input); // "one"

您可以unset将元素取出并将其放在前面:

$input = array(
    "one"   => "element one",
    "two"   => "element two",
    "three" => "element three",
);
$key = "two";
$element = $input[$key];
unset($input[$key]);
// Complicated associative array unshift:
$input = array_reverse($input);
$input[$key] = $element;
$input = array_reverse($input);
print_r($input);
于 2012-07-20T16:56:44.097 回答