Как вставить значение и ключ в массив PHP

355

Посмотрите на этот код:

$GET = array();    
$key = 'one=1';
$rule = explode('=', $key);
/* array_push($GET, $rule[0] => $rule[1]); */

Я ищу что-то вроде этого, чтобы:

print_r($GET);
/* output: $GET[one => 1, two => 2, ...] */

Есть ли функция для этого? (потому array_pushчто не будет работать таким образом)

гал
источник

Ответы:

760

Нет, array_push()для ассоциативных массивов нет эквивалента, потому что нет способа определить следующий ключ.

Вам придется использовать

$arrayname[indexname] = $value;
Пекка
источник
10
Я не понимаю Разве это не нормальный способ добавления элементов в массив?
rgin
Как добавить несколько ключей и значений в массив? Например, у меня есть [indexname1] = $ value1 и [indexname2] = $ value2, и я хочу добавить их в $ arrayname
King Goeks
8
@KingGoeks $arrayname = array('indexname1' => $value1, 'indexname2' => $value2);установил бы их как единственные пункты в $arrayname. Если вы уже $arraynameустановили и хотите сохранить его значения, попробуйте $arrayname += $anotherarray. Имейте в виду, что любые существующие ключи в первом массиве будут перезаписаны вторым.
Чарли Шлиссер
1
«Имейте в виду, что любые существующие ключи в первом массиве будут перезаписаны вторым», что неверно, первый массив имеет приоритет. если вы это сделаете, $a = array("name" => "John"); $a += array("name" => "Tom");то $a["name"]будет "Джон"
Сантьяго Аристи
это самый простой способ.
NomanJaved
75

Вставка значения в массив автоматически создает для него числовой ключ.

При добавлении пары ключ-значение в массив у вас уже есть ключ, вам не нужно его создавать. Вставка ключа в массив не имеет смысла. Вы можете установить только значение определенного ключа в массиве.

// no key
array_push($array, $value);
// same as:
$array[] = $value;

// key already known
$array[$key] = $value;
децезе
источник
66

Вы можете использовать оператор union ( +) для объединения массивов и сохранения ключей добавленного массива. Например:

<?php

$arr1 = array('foo' => 'bar');
$arr2 = array('baz' => 'bof');
$arr3 = $arr1 + $arr2;

print_r($arr3);

// prints:
// array(
//   'foo' => 'bar',
//   'baz' => 'bof',
// );

Так что вы могли бы сделать $_GET += array('one' => 1);.

Более подробную информацию об использовании оператора union vs можно найти array_mergeв документации по адресу http://php.net/manual/en/function.array-merge.php .

Чарли Шлиссер
источник
4
Основное различие между оператором array_merge()and +заключается в том, что 2 массива содержат значения в одном и том же ключе. +Оператор игнорирует значение из второго массива (не переопределяет), а также не перенумеровывает / не переиндексирует числовые ключи ...
jave.web
Спасибо, я попробовал многие функции массивов, но ваш ответ помог мне достичь того, чего я хочу,
датский
21

Я хотел бы добавить свой ответ в таблицу, и вот оно:

//connect to db ...etc
$result_product = /*your mysql query here*/ 
$array_product = array(); 
$i = 0;

foreach ($result_product as $row_product)
{
    $array_product [$i]["id"]= $row_product->id;
    $array_product [$i]["name"]= $row_product->name;
    $i++;
}

//you can encode the array to json if you want to send it to an ajax call
$json_product =  json_encode($array_product);
echo($json_product);

надеюсь, что это кому-нибудь поможет

Нассим
источник
1
Я просмотрел десятки решений, и это единственное, что подходит для моего варианта использования. Спасибо!
Райан Бурни
20

Именно то, что сказал Пекка ...

В качестве альтернативы вы можете использовать array_merge следующим образом:

array_merge($_GET, array($rule[0] => $rule[1]));

Но я бы предпочел метод Пекки, вероятно, так как он намного проще.

jeffff
источник
11

Интересно, почему самый простой метод еще не опубликован:

$arr = ['company' => 'Apple', 'product' => 'iPhone'];
$arr += ['version' => 8];
AlexioVay
источник
2
это не совсем то же самое, в array_merge, массив справа выигрывает при конфликте ключей, в "+ =" массив слева выигрывает
santiago arizti
@santiagoarizti Что вы подразумеваете под "победами"?
AlexioVay
1
если два массива имеют одинаковый ключ, array_mergeи массив union ( +=) ведет себя противоположным образом, то есть array_merge будет учитывать значение из второго массива, а объединение массивов будет учитывать значение из первого массива.
Сантьяго Аристи
идеальное решение для меня. THX для обмена Alexio! :)
ThomasB
8

Это решение, которое может быть полезным для вас

Class Form {
# Declare the input as property
private $Input = [];

# Then push the array to it
public function addTextField($class,$id){
    $this->Input ['type'][] = 'text';
    $this->Input ['class'][] = $class;
    $this->Input ['id'][] = $id;
}

}

$form = new Form();
$form->addTextField('myclass1','myid1');
$form->addTextField('myclass2','myid2');
$form->addTextField('myclass3','myid3');

Когда вы бросаете это. Результат как этот

array (size=3)
  'type' => 
    array (size=3)
      0 => string 'text' (length=4)
      1 => string 'text' (length=4)
      2 => string 'text' (length=4)
  'class' => 
    array (size=3)
      0 => string 'myclass1' (length=8)
      1 => string 'myclass2' (length=8)
      2 => string 'myclass3' (length=8)
  'id' => 
    array (size=3)
      0 => string 'myid1' (length=5)
      1 => string 'myid2' (length=5)
      2 => string 'myid3' (length=5)
Фарис Райхан
источник
7

Я просто искал то же самое, и я понял, что, опять же, мое мышление отличается, потому что я старая школа. Я возвращаюсь к BASIC и PERL и иногда забываю, как на самом деле все просто в PHP.

Я просто сделал эту функцию, чтобы взять все настройки из базы данных, где их 3 колонки. setkey, item (key) & value (value) и поместите их в массив, называемый settings, используя тот же ключ / value без использования push, как описано выше.

Довольно легко и просто на самом деле

// Получить все настройки
$ Настройки = getGlobalSettings ();


// Применить выбор темы пользователя
$ theme_choice = $ settings ['theme'];

.. и т. д. и т. д. ....




function getGlobalSettings () {

    $ dbc = mysqli_connect (wds_db_host, wds_db_user, wds_db_pass) или die ("Ошибка MySQL:". mysqli_error ());
    mysqli_select_db ($ dbc, wds_db_name) или die («Ошибка MySQL:». mysqli_error ());
    $ MySQL = "SELECT * FROM systemSettings";
    $ result = mysqli_query ($ dbc, $ MySQL);
    while ($ row = mysqli_fetch_array ($ result)) 
        {
        $ settings [$ row ['item']] = $ row ['value']; // НЕ НАДО
        }
    mysqli_close ($ DBC);
вернуть настройки $;
}


Так как другие посты объясняют ... В php нет необходимости "толкать" массив, когда вы используете

Ключ => Значение

И ... Нет необходимости сначала определять массив.

$ Массива = массив ();

Не нужно определять или толкать. Просто назначьте $ array [$ key] = $ value; Это автоматически push и объявление одновременно.

Я должен добавить, что по соображениям безопасности, (P) или (H) elpless (P), я имею в виду Программирование для чайников, я имею в виду PHP .... хехехе, я предлагаю вам использовать эту концепцию только для того, что я намеревался. Любой другой метод может быть угрозой безопасности. Там сделал мой отказ от ответственности!

Кори Каллерс
источник
5
array_push($arr, ['key1' => $value1, 'key2' => value2]);

Это работает просто отлично. создает ключ со значением в массиве

Mesh Manuel
источник
4
Downvoted. Это просто выдвигает новый массив в конец существующего $arrмассива.
AlexioVay
4

Немного поздно, но если вы не возражаете против вложенного массива, вы можете использовать этот подход:

$main_array = array(); //Your array that you want to push the value into
$value = 10; //The value you want to push into $main_array
array_push($main_array, array('Key' => $value));

Чтобы уточнить, если вы выводите json_encode ($ main_array) , он будет выглядеть как [{"Key": "10"}]

Понт Б
источник
4

Немного странно, но это сработало для меня

    $array1 = array("Post Slider", "Post Slider Wide", "Post Slider");
    $array2 = array("Tools Sliders", "Tools Sliders", "modules-test");
    $array3 = array();

    $count = count($array1);

    for($x = 0; $x < $count; $x++){
       $array3[$array1[$x].$x] = $array2[$x];
    }

    foreach($array3 as $key => $value){
        $output_key = substr($key, 0, -1);
        $output_value = $value;
        echo $output_key.": ".$output_value."<br>";
    }
Бьорн Лоттеринг
источник
3
 $arr = array("key1"=>"value1", "key2"=>"value");
    print_r($arr);

// печатает массив ['key1' => "value1", 'key2' => "value2"]

снеха
источник
2

привет у меня была та же проблема, я нахожу это решение, вы должны использовать два массива, а затем объединить их оба

 <?php

$fname=array("Peter","Ben","Joe");

$age=array("35","37","43");

$c=array_combine($fname,$age);

print_r($c);

?>

ссылка: w3schools

fantome195
источник
2

Для добавления на первую позицию с помощью keyиvalue

$newAarray = [newIndexname => newIndexValue] ;

$yourArray = $newAarray + $yourArray ;
Bashirpour
источник
2

Чтобы вставить «ключ» и «значение» в существующий массив, вы можете использовать +=оператор быстрого доступа.

Посмотрите на этот очень простой пример:

$GET = [];
$GET += ['one' => 1];

Результатом print_r($GET)будет:

Array
(
    [one] => 1
)
Нурул Худа
источник
1

Пример array_merge () ....

$array1 = array("color" => "red", 2, 4); $array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4); $result = array_merge($array1, $array2); print_r($result);

Массив ([color] => зеленый, [0] => 2, [1] => 4, [2] => a, [3] => b, [shape] => трапеция, [4] => 4 ,)

illeas
источник
1
array_push($GET, $GET['one']=1);

Меня устраивает.

ааа
источник
Это выполняется $GET['one']=1, затем использует возвращаемое значение этого оператора (= 1, значение r) и затем выполняется array_push($GET, 1). Результат = [0] -> 1, [один] -> 1
KekuSemau
0

Я написал простую функцию:

function push(&$arr,$new) {
    $arr = array_merge($arr,$new);
}

так что я могу легко "вставить" новый элемент:

push($my_array, ['a'=>1,'b'=>2])
Elect2
источник
0

Здесь есть несколько замечательных примеров. Просто добавив простой пример, чтобы поместить элементы ассоциативного массива в корневой индекс числового индекса.

`$intial_content = array();

if (true) {
 $intial_content[] = array('name' => 'xyz', 'content' => 'other content');
}`
Дипак Раджпал
источник
0

Я обычно делаю это:

$array_name = array(
'key1' => 'value1',
'key2' => 'value2',
'key3' => 'value3'
);
marcnyc
источник