32

私がこの配列を持っているとしましょう:

$array = array('a'=>1,'z'=>2,'d'=>4);

'c'=>3スクリプトの後半で、の前に値を追加したいと思います'z'。これどうやってするの?

はい、順序は重要です。配列を介してforeach()を実行するとき、この新しく追加された値を配列の最後に追加したくありません。この配列をmysql_fetch_assoc()から取得しています

上で使用したキーはプレースホルダーです。ksort()を使用しても、私が望むことは達成されません。

http://www.php.net/manual/en/function.array-splice.php#88896は私が探していることを達成しますが、もっと簡単なものを探しています。

約30列のサンプルdbテーブルを取得します。このデータはmysql_fetch_assoc()を使用して取得します。この新しい配列では、列「pizza」と「drink」の後に、「pizza」と「drink」の値を組み合わせた新しい列「full_dinner」を追加して、上記の配列でforeach()を実行したいと考えています。 、'full_dinner'は'drink'の直後にあります

4

13 に答える 13

45

私は何かが足りないのですか?

$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)));
于 2012-03-23T23:23:08.770 に答える
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 );
于 2010-01-27T19:00:07.570 に答える
11

あなたの元の質問によると、私が見つけることができる最良の答えはこれです:

$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)
}

アレイの大きさに応じて、このソリューションを使用するか別のソリューションを使用するかに関係なく、内部メモリにかなりのデータを複製します。

さらに、5回目の編集は、SQLクエリを改善できる可能性があることを示しているようです。あなたがやりたいと思われることは、次のようなものになるでしょう。

SELECT a, b, CONCAT(a, ' ', b) AS ab FROM ... WHERE ...

ステートメントを変更するSELECTとPHPソリューションが冗長になる可能性がある場合は、変更したSQLを使用する必要があります。

于 2012-03-22T16:02:25.550 に答える
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,
  ...
)
于 2010-01-27T19:26:54.950 に答える
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);
于 2012-03-26T12:08:41.617 に答える
0

連想配列は順序付けられていないため、で追加するだけです$array['c'] = 3

順序が重要な場合、1つのオプションは次のようなデータ構造に切り替えることです。

$array = array(
   array('a' => 1),
   array('b' => 2)
   array('d' => 4)
);

次に、を使用array_splice($array, 2, 0, array('c' => 3))して位置2に挿入します。array_spliceのマニュアルを参照してください。

于 2010-01-27T18:40:26.570 に答える
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];
}
于 2010-01-27T18:47:57.600 に答える
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];
    }
}
于 2010-01-27T19:40:58.523 に答える
0

今のところ、新しい配列の作成を最小限に抑えるために私が見つけることができる最善の方法は、次の2つの関数です。

1つ目は値を元の配列に置き換えようとし、2つ目は新しい配列を返します。

// 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, )
于 2012-03-23T09:15:07.520 に答える
0

配列関数の優れた使用法ですが、これをより簡単な方法としてはどうでしょうか。

SQLに静的列を追加してから、結果の配列で置き換えます。順序は同じままです:

SQL:

Select pizza , drink , 'pizza-drink' as 'pizza-drink' , 28 columns..... From Table

配列 :

$result['pizza-drink'] = $result['pizza'] . $result['drink'];
于 2015-10-25T18:00:48.673 に答える
0

n番目の位置にデータを挿入する必要がある場合の簡略化されたAlixAxel関数:

function array_middle_push( array $array, int $position, array $data ): array {
   return array_merge( array_slice( $array, 0, $position ), $data, array_slice( $array, $position ) );
}
于 2019-06-23T20:53:18.490 に答える
-1

これを試して

$array['c']=3;

連想配列はデフォルトでは順序付けられていませんが、アルファベット順に並べ替える場合はksort()、キーで配列を並べ替えることができます。

PHPの記事をチェックするksort()と、配列をそのキーで簡単に並べ替えることができます。次に例を示します。

<?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
于 2010-01-27T18:40:04.473 に答える
-1

あなたはそれを行うことによってそれを追加することができます

$array['c']=3;

印刷目的でどうしてもソートしたい場合は、phpのksort($ array)関数を使用できます。

キーがksortでソートできない場合は、phpのuasort関数を使用して独自のソートを作成する必要があります。こちらの例をご覧ください

http://php.net/manual/en/function.uasort.php

于 2010-01-27T18:43:22.200 に答える