Öğe adları önceden bilinen tüm farklı ve olmayan PHP büyük bir sonrası dizi işlemek nasıl?

4 Cevap php

I have a PHP page that queries a DB to populate a form for the user to modify the data and submit.
The query returns a number of rows which contain 3 items:

  1. ImageID
  2. GörüntüAdı
  3. ImageDescription

PHP sayfa başlıkları genel bir adla şeklinde her bir kutu ve ona ImageId ekler. Yani:

  • ImageID_03
  • GörüntüAdı_34
  • ImageDescription_22

As it's unknown which images are going to have been retrieved from the DB then I can't know in advance what the name of the form entries will be. The form deals with a large number of entries at the same time.

Verileri alır Benim backend PHP form işlemci sadece büyük bir dizi olarak görüyor:

[imageid_2] => 2
[imagename_2] => _MG_0214
[imageid_10] => 10
[imagename_10] => _MG_0419
[imageid_39] => 39
[imagename_39] => _MG_0420
[imageid_22] => 22
[imagename_22] => Curly Fern
[imagedescription_2] => Wibble
[imagedescription_10] => Wobble
[imagedescription_39] => Fred
[imagedescription_22] => Sally

Ben yerleri ayarlanır ancak şaşırıp 3 diziler bölmek üzerine bir dizi yürüyüş yapmak için denedim:

// define empty arrays
$imageidarray = array();
$imagenamearray = array();
$imagedescriptionarray = array();

// our function to call when we walk through the posted items array
function assignvars($entry, $key)
{
 if (preg_match("/imageid/i", $key)) { 
  array_push($imageidarray, $entry);
 } elseif (preg_match("/imagename/i", $key)) {
//     echo " GörüntüAdı: $entry";
 } elseif (preg_match("/imagedescription/i", $key)) {
//     echo " ImageDescription: $entry";
 }
}

array_walk($_POST, 'assignvars');

This fails with the error:
array_push(): First argument should be an array in...

Ben bu yanlış yaklaşıyor muyum?

4 Cevap

Bu öğeler formunda adlandırılır biçimini değiştirmek mümkün olurdu?

Akım:

  • ImageID_03
  • ImageName_34
  • ImageDescription_22

Değişti için:

  • ImageID [03]
  • ImageName [34]
  • ImageDescription [22]

Bu şekilde, tüm bu ekstra işlem atlayabilirsiniz anlamı üç ayrı diziler olarak $ _POST ile gelmelidir.

  1. Ben aynı anda birçok satırlarını düzenlemek nefret ediyorum. Bu kullanılabilirlik hatası
  2. Ben bunun için gitmek, ben böyle bir formu ile bunu yapmak istiyorum:

    <form method="POST">
    <input type="text" name="name[1]">
    <input type="text" name="desc[1]">
    <input type="text" name="name[2]">
    <input type="text" name="desc[2]">
    ...etc
    </form>

Id bir anahtar olarak kullanılan nereye kadar, ben 2 diziler, $ _POST ['isim'] ve $ _POST ['desc'] olurdu

Bu sadece bir sözdizimi şeker olduğu gibi sizin durumunuzda array_walk kullanmak olmaz, ve veri işleme üzerinde tam contorol var foreach ile bunu yapmak.

Sana ihtiyacım var

global $imageidarray;

Bir işlev içinde bir global dizi erişmek için.

Böyle bir şey sizin üç form alanları her zaman birlikte teslim varsayarak, de çalışmak:

$ids = preg_grep('/^imageid_(\d+)$/', array_keys($_POST)); // $ids now contains only the imageid_* keys

foreach($ids as $id) {
    $id = substr($ids, 8); // now contains the numeric id of the field
    echo $id, ": ", $_POST["imageid_$id"], "\n";
}

Gibi form adları dizi notalarını kullanmak gibi verimli, ancak trivially alan isimlerden biri sadece kimlik numaralarını ayıklamak ve ardından da diğer eşleşen alanlar erişmek için kullanmak için izin verir değil.