让我说我有这个阵列:
$array = array('a'=>1,'z'=>2,'d'=>4);
稍后在脚本中,我想在'c'=>3
之前添加值'z'
。我怎么能这样做?
编辑2:我上面使用的键是占位符。使用ksort()将达不到我想要的效果。
编辑3:http://www.php.net/manual/en/function.array-splice.php#88896完成了我正在寻找的东西,但我正在寻找更简单的东西。
编辑4:谢谢你的支持。我对你的答案给出了反馈,你无能为力,所以你贬低并要求关闭这个问题,因为你不知道答案。感谢。
编辑5:获取一个包含大约30列的示例数据库表。我使用mysql_fetch_assoc()获取此数据。在这个新数组中,在'pizza'和'drink'列之后,我想添加一个新列'full_dinner',它结合了'pizza'和'drink'的值,这样当我在所述数组上运行foreach()时,'full_dinner'直接来自'drink'
答案 0 :(得分:33)
我错过了什么吗?
$key = 'z';
$offset = array_search($key, array_keys($array));
$result = array_merge
(
array_slice($array, 0, $offset),
array('c' => 3),
array_slice($array, $offset, null)
);
处理不存在的密钥(默认添加$data
):
function insertBeforeKey($array, $key, $data = null)
{
if (($offset = array_search($key, array_keys($array))) === false) // if the key doesn't exist
{
$offset = 0; // should we prepend $array with $data?
$offset = count($array); // or should we append $array with $data? lets pick this one...
}
return array_merge(array_slice($array, 0, $offset), (array) $data, array_slice($array, $offset));
}
演示:
$array = array('a' => 1, 'z' => 2, 'd' => 4);
// array(4) { ["a"]=> int(1) ["c"]=> int(3) ["z"]=> int(2) ["d"]=> int(4) }
var_dump(insertBeforeKey($array, 'z', array('c' => 3)));
// array(4) { ["a"]=> int(1) ["z"]=> int(2) ["d"]=> int(4) ["c"]=> int(3) }
var_dump(insertBeforeKey($array, 'y', array('c' => 3)));
答案 1 :(得分:14)
一个简单的方法是迭代原始数组,然后构建一个新数组:
function InsertBeforeKey( $originalArray, $originalKey, $insertKey, $insertValue ) {
$newArray = array();
$inserted = false;
foreach( $originalArray as $key => $value ) {
if( !$inserted && $key === $originalKey ) {
$newArray[ $insertKey ] = $insertValue;
$inserted = true;
}
$newArray[ $key ] = $value;
}
return $newArray;
}
然后只需致电
$array = InsertBeforeKey( $array, 'd', 'c', 3 );
答案 2 :(得分:10)
根据您的原始问题,我能找到的最佳答案是:
$a = array('a'=>1,'z'=>2,'d'=>4);
$splitIndex = array_search('z', array_keys($a));
$b = array_merge(
array_slice($a, 0, $splitIndex),
array('c' => 3),
array_slice($a, $splitIndex)
);
var_dump($b);
array(4) {
["a"]=>
int(1)
["c"]=>
int(3)
["z"]=>
int(2)
["d"]=>
int(4)
}
根据您的阵列的大小,您将在内部存储器中复制相当多的数据,无论您是否使用此解决方案。
此外,您的第五个编辑似乎表明您的SQL查询可以改进。你似乎想要做的就是这样:
SELECT a, b, CONCAT(a, ' ', b) AS ab FROM ... WHERE ...
如果更改SELECT
语句可能会使PHP解决方案变得多余,那么您一定应该使用修改后的SQL。
答案 3 :(得分:5)
function insertValue($oldArray, $newKey, $newValue, $followingKey) {
$newArray = array ();
foreach (array_keys($oldArray) as $k) {
if ($k == $followingKey)
$newArray[$newKey] = $newValue;
$newArray[$k] = $oldArray [$k];
}
return $newArray;
}
您将其称为
insertValue($array, 'c', '3', 'z')
至于编辑5:
编辑你的sql,使其读取
SELECT ..., pizza, drink, pizza+drink as full_meal, ... FROM ....
您自动拥有该列:
Array (
...
'pizza' => 12,
'drink' => 5,
'full_meal' => 17,
...
)
答案 4 :(得分:0)
关联数组不是有序的,因此您只需添加$array['c'] = 3
。
如果订单很重要,一个选项就是切换到更像是的数据结构:
$array = array(
array('a' => 1),
array('b' => 2)
array('d' => 4)
);
然后,使用array_splice($array, 2, 0, array('c' => 3))
插入第2位。请参阅array_splice上的手册。
答案 5 :(得分:0)
另一种方法是使用有序索引来补充关联数组结构,该索引确定键的迭代顺序。例如:
$index = array('a','b','d');
// Add new value and update index
$array['c'] = 3;
array_splice($index, 2, 0, 'c');
// Iterate the array in order
foreach $index as $key {
$value = $array[$key];
}
答案 6 :(得分:0)
您可以在按键排序时定义自己的排序图。这可能不是非常有效但它有效。
<pre>
<?php
$array = array('a'=>1,'z'=>2,'d'=>4);
$array['c'] = 3;
print_r( $array );
uksort( $array, 'sorter' );
print_r( $array );
function sorter( $a, $b )
{
static $ordinality = array(
'a' => 1
, 'c' => 2
, 'z' => 3
, 'd' => 4
);
return $ordinality[$a] - $ordinality[$b];
}
?>
</pre>
这是一种基于ArrayObject的方法,使用相同的概念
$array = new CitizenArray( array('a'=>1,'z'=>2,'d'=>4) );
$array['c'] = 3;
foreach ( $array as $key => $value )
{
echo "$key: $value <br>";
}
class CitizenArray extends ArrayObject
{
static protected $ordinality = array(
'a' => 1
, 'c' => 2
, 'z' => 3
, 'd' => 4
);
function offsetSet( $key, $value )
{
parent::offsetSet( $key, $value );
$this->uksort( array( $this, 'sorter' ) );
}
function sorter( $a, $b )
{
return self::$ordinality[$a] - self::$ordinality[$b];
}
}
答案 7 :(得分:0)
目前我发现尝试最小化新阵列创建的最佳功能是这两个功能:
第一个尝试将值替换为原始数组,第二个返回一个新数组。
// replace value into the original array
function insert_key_before_inplace(&$base, $beforeKey, $newKey, $value) {
$index = 0;
foreach($base as $key => $val) {
if ($key==$beforeKey) break;
$index++;
}
$end = array_splice($base, $index, count($base)-$index);
$base[$newKey] = $value;
foreach($end as $key => $val) $base[$key] = $val;
}
$array = array('a'=>1,'z'=>2,'d'=>4);
insert_key_before_inplace($array, 'z', 'c', 3);
var_export($array); // array ( 'a' => 1, 'c' => 3, 'z' => 2, 'd' => 4, )
// create new array
function insert_key_before($base, $beforeKey, $newKey, $value) {
$index = 0;
foreach($base as $key => $val) {
if ($key==$beforeKey) break;
$index++;
}
$end = array_splice($base, $index, count($base)-$index);
$base[$newKey] = $value;
return $base+$end;
}
$array = array('a'=>1,'z'=>2,'d'=>4);
$newArray=insert_key_before($array, 'z', 'c', 3);
var_export($array); // ( 'a' => 1, 'z' => 2, 'd' => 4, )
var_export($newArray); // array ( 'a' => 1, 'c' => 3, 'z' => 2, 'd' => 4, )
答案 8 :(得分:0)
function putarrayelement(&$array, $arrayobject, $elementposition, $value = null) {
$count = 0;
$return = array();
foreach ($array as $k => $v) {
if ($count == $elementposition) {
if (!$value) {
$value = $count;
}
$return[$value] = $arrayobject;
$inserted = true;
}
$return[$k] = $v;
$count++;
}
if (!$value) {
$value = $count;
}
if (!$inserted){
$return[$value];
}
$array = $return;
return $array;
}
$array = array('a' => 1, 'z' => 2, 'd' => 4);
putarrayelement($array, '3', 1, 'c');
print_r($array);
答案 9 :(得分:0)
对数组函数的大量使用,但这是一种更简单的方法:
向SQL添加静态列,然后在结果数组中替换它。订单保持不变:
SQL:
Select pizza , drink , 'pizza-drink' as 'pizza-drink' , 28 columns..... From Table
数组:
$result['pizza-drink'] = $result['pizza'] . $result['drink'];
答案 10 :(得分:0)
简化的Alix Axel函数,如果您只需要在第n个位置插入数据:
function array_middle_push( array $array, int $position, array $data ): array {
return array_merge( array_slice( $array, 0, $position ), $data, array_slice( $array, $position ) );
}
答案 11 :(得分:-1)
试试这个
$array['c']=3;
默认情况下不会对关联数组进行排序,但如果您想按字母顺序对它们进行排序,可以使用ksort()
按数字键对数组进行排序。
如果您查看ksort()
的{{3}},您可以轻松按键对数组进行排序,例如:
<?php
$fruits = array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
ksort($fruits);
foreach ($fruits as $key => $val) {
echo "$key = $val\n";
}
?>
// The above example will output:
a = orange
b = banana
c = apple
d = lemon
答案 12 :(得分:-1)
你可以通过
添加它$array['c']=3;
如果您绝对希望将其排序以进行打印,则可以使用php的ksort($ array)函数
如果键不能被ksort排序,那么你必须使用php的uasort函数创建自己的排序。看这里的例子