PHP - 排序时修改数组

时间:2017-07-12 19:57:40

标签: php arrays sorting

我需要按字母顺序对字符串数组进行排序,并将每个键设置为与值相同(因为isset()比in_array()快得多)。我可以通过在阵列上进行两次传递轻松地做到这一点,但我很好奇是否可以在一次传球中完成。

我想转此:

array(
    0 => 'car',
    1 => 'apple',
    2 => 'dog',
    3 => 'box'
)

......进入这个:

array(
    'apple' => 'apple',
    'box' => 'box',
    'car' => 'car',
    'dog' => 'dog'
)

我已经完成了一些搜索,但我似乎无法找到任何相关内容(大多数情况下,我只能找到有关在排序时保持键值关系的内容)。

我知道这可能被视为微优化的尝试,但我要求出于好奇而不是提高性能的愿望。我希望通过解决这个问题可以学到一些有用的东西,这样我才能掌握将来的知识。

编辑:这用于更改mysql数据库中的枚举字段。将新功能添加到系统时,某些列中需要新的枚举值。我没有追踪错误并手动添加新值,而是希望系统能够自我修正。

基本上,尝试插入一行。如果它失败并且在添加未定义的枚举值时抛出了截断错误,则拉出列的枚举,检查枚举是否存在(可能是导致错误的另一个问题),如果它不是& #39; t,并且值不是NULL或空字符串,添加它。

为了我自己的理智,我想按字母顺序保存枚举值,我设置键和值是一样的,所以我可以做两件事:

  1. 请设置($ values($ new_value))而不是in_array($ value,$ values)。这就是我需要键中值的原因。

  2. 使用implode构建ALTER语句:$query_text = "ALTER TABLE table CHANGE column column ENUM('".implode("','",$values)."')...;";

  3. 我意识到我可以在这种情况下使用implode("','",array_keys($values)),但我很好奇我将如何做我最初提出的问题,因为将来我可能需要做更多的事情复杂到数组,同时对其进行排序。

    TL; DR:我对是否在排序时改变此数组不感兴趣,但我 的方式在对数组进行排序时更改数组。

2 个答案:

答案 0 :(得分:0)

以下是您的需求:

<?php

$original = array(
    0 => 'car',
    1 => 'apple',
    2 => 'dog',
    3 => 'box'
);

$values = array_values($original);
sort($values);
$keys = array_combine($values, $values);

print_r($keys);
?>

并打印出来

Array
(
    [apple] => apple
    [box] => box
    [car] => car
    [dog] => dog
)

答案 1 :(得分:0)

如果目标是删除重复项,按字母顺序排序,并享受isset()的效果,则只需致电array_flip($array),然后致电ksort($array)

具体而言,array_flip()将清除所有重复内容并设置isset()

或者,如果您想生成相同的键值对:

代码:(Demo

$array = ['car', 'apple', 'dog', 'box'];
sort($array);
var_export(array_combine($array, $array));  // no need to call array_values()

输出:

array (
  'apple' => 'apple',
  'box' => 'box',
  'car' => 'car',
  'dog' => 'dog',
)

我将向未来的研究人员做一个说明......虽然isset()in_array()更快,但如果您在重新配置数据阵列时遇到更大的麻烦,性能优势就会消除。

相关问题