我需要按字母顺序对字符串数组进行排序,并将每个键设置为与值相同(因为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或空字符串,添加它。
为了我自己的理智,我想按字母顺序保存枚举值,我设置键和值是一样的,所以我可以做两件事:
请设置($ values($ new_value))而不是in_array($ value,$ values)。这就是我需要键中值的原因。
使用implode构建ALTER语句:$query_text = "ALTER TABLE table CHANGE column column ENUM('".implode("','",$values)."')...;";
我意识到我可以在这种情况下使用implode("','",array_keys($values))
,但我很好奇我将如何做我最初提出的问题,因为将来我可能需要做更多的事情复杂到数组,同时对其进行排序。
TL; DR:我对是否在排序时改变此数组不感兴趣,但我 的方式在对数组进行排序时更改数组。
答案 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()
更快,但如果您在重新配置数据阵列时遇到更大的麻烦,性能优势就会消除。