web-dev-qa-db-ja.com

多次元配列を持つPHP foreach

データベースクラスを使用してmySQLをクエリするphpアプリを開発しています。

クラスはここにあります: http://net.tutsplus.com/tutorials/php/real-world-oop-with-php-and-mysql/

私は自分のニーズに合わせてクラスを微調整しましたが、問題があります(おそらくバカな問題です)

Select()を使用すると、3つの列(id、firstname、lastname)を持つテーブルのような多次元配列を返します。

 Array 
(
 [0] => Array 
(
 [id] => 1 
 [firstname] => Firstname one 
 [lastname] => Lastname one 
)
 
 [1] => Array 
(
 [id] => 2 
 [firstname] => Firstname two 
 [lastname] => Lastname two 
)
 
 [2] => Array 
(
 [id] => 3 
 [firstname] => Firstname three 
 [lastname] => Lastname three 
)
)

ここで、この配列をmysqlの結果(mysql_fetch_assoc)として使用する必要があります。

Foreach()で使用できることは知っていますが、これは単純な配列で使用されます。そのため、各foreach()で新しいforeach()を再宣言する必要があると思いますが、これにより速度が低下したり、サーバーの負荷が高くなる可能性があると思います。

では、この多次元配列でforeach()を最も簡単な方法で適用する方法は?

ありがとう

50
medk

ここでforeachを使用できます。

foreach ($rows as $row) {
    echo $row['id'];
    echo $row['firstname'];
    echo $row['lastname'];
}

数値インデックス($row[0]など)を使用してデータにアクセスするのに慣れていると思いますが、これは必須ではありません。 連想配列 を使用して、目的のデータを取得できます。

108
Brad

array_walk_recursiveを使用できます:

array_walk_recursive($array, function ($item, $key) {
    echo "$key holds $item\n";
});
14
Karolis

これはブラッドの答えの下でのコメントでしたが、私は十分に高い評判を持っていません。

最近、多次元配列のキーも必要であることがわかりました。つまり、foreachループでは、配列の単なるインデックスではありませんでした。

それを達成するために、受け入れられた答えに非常によく似たものを使用できますが、代わりに次のようにキーと値を分割します

foreach ($mda as $mdaKey => $mdaData) {
    echo $mdaKey . ": " . $mdaData["value"];
}

それが誰かを助けることを願っています。

4
arvy3

Holla/Hello、わかりました!ファイル名、tmp_name、file_sizeなどを簡単に取得できます。コード行を使用してファイル名を取得する方法を示します。

for ($i = 0 ; $i < count($files['name']); $i++) {
    echo $files['name'][$i].'<br/>';
}

私のPCでテストされています。

3
Asraful Haque

PHPの配列では、foreachループは常にかなりの解決策です。
この場合、たとえば次のようになります。

foreach($my_array as $number => $number_array)
    {
    foreach($number_array as $data = > $user_data)
        {
            print "Array number: $number, contains $data with $user_data.  <br>";
        }
    }
3
nao_de_naoned

mysql_fetch_assoc()の例:

while ($row = mysql_fetch_assoc($result))
{
    /* ... your stuff ...*/
}

foreachを使用する場合、$result配列を使用すると、select()から取得できます。

foreach ($result as $row)
{
    /* ... your stuff ...*/
}

同じように、適切に反復されます。

2
aorcsik

多次元配列内の各値の詳細を取得することは、配列を配置した後は非常に簡単です。これが配列です:

$example_array = array(
array('1','John','Smith'),
array('2','Dave','Jones'),
array('3','Bob','Williams')
);

次に、foreachループを使用して、配列を次のように実行します。

foreach ($example_array as $value) {
echo $value[0]; //this will echo 1 on first cycle, 2 on second etc....
echo $value[1]; //this will echo John on first cycle, Dave on second etc....
echo $value[2]; //this will echo Smith on first cycle, Jones on second etc....
}

周りに好きなものをエコーすることができるので、テーブルにエコーするには:

echo "<table>"
    foreach ($example_array as $value) {
    echo "<tr><td>" . $value[0] . "</td>";
    echo "<td>" . $value[1] . "</td>";
    echo "<td>" . $value[2] . "</td></tr>";
    }
echo "</table>";

次のような表が表示されます。

|1|John|Smith   |
|2|Dave|Jones   |
|3|Bob |Williams|
2
Rmj86

理想的には、多次元配列は通常配列の配列であるため、空の配列を宣言し、dbからキーと値のペアを作成して別の配列を作成し、最後に繰り返しで作成された各配列を外側の配列にプッシュします。これが別の関数呼び出しである場合、外部配列を返すことができます。役立つことを願っています

$response = array();    
foreach ($res as $result) {
        $elements = array("firstname" => $result[0], "subject_name" => $result[1]);
        array_Push($response, $elements);
    }
1
Poly

これはかなり古い答えだと思います。 foreachを使用しない高速なソリューションを次に示します。

array_columnを使用

print_r(array_column($array, 'firstname')); #returns the value associated with that key 'firstname'

また、上記の操作を実行する前に確認できます

if(array_key_exists('firstname', $array)){
   print_r(array_column($array, 'firstname'));
}
1

配列要素で文字列操作を行う必要がある場合、たとえば、コールバック関数 array_walk_recursive (または array_walk )を使用してもうまく機能します。両方とも、SQLステートメントを動的に記述するときに役立ちます。

この使用法では、各要素にコンマと改行を追加する必要があるこの配列があります。

$some_array = [];

$ some_arrayのデータ
0: "配列内の一部の文字列"
1:「配列内の別の文字列」

php.netごと

callback が配列の実際の値を処理する必要がある場合、コールバックの最初のパラメーターを参照として指定します。次に、これらの要素に加えられた変更は、元の配列自体で行われます。

array_walk_recursive($some_array, function (&$value, $key) {
    $value .= ",\n";
});

結果:
"配列内の一部の文字列、\ n"
"配列内の別の文字列、\ n"

Array_walkを使用してデータベーステーブル名をフィールドに追加する同じ概念を次に示します。

$fields = [];

$ fieldsのデータ:
0:「名」
1:「姓」

$tbl = "Employees"

array_walk($fields, 'prefixOnArray', $tbl.".");

function prefixOnArray(&$value, $key, $prefix) { 
    $value = $prefix.$value; 
}

結果:
"Employees.FirstName"
"Employees.LastName"


Foreachでパフォーマンスに問題があるかどうか知りたいのですが、少数の要素(IMHO)を含む配列の場合、検討する価値はほとんどありません。

0
Greg Bologna

通常のforeachは、基本的にmysql_fetch_assocと同じ結果になりませんか?

その配列でforeachを使用すると、「id」、「firstname」、「lastname」の3つのキーを含む配列を取得できます。

これは、mysql_fetch_assocが各行に(ループで)与えるのと同じでなければなりません。

0
Yhn
foreach ($parsed as $key=> $poke)
{
    $insert = mysql_query("insert into soal 
                          (pertanyaan, a, b, c, d, e, jawaban)
                          values
                          ('$poke[question]',
                          '$poke[options][A]',
                          '$poke[options][B]',
                          '$poke[options][C]',
                          '$poke[options][D]',
                          '$poke[options][E]',
                          '$poke[answer]')");
}
0
endip