1

解決しました。回答やコメントで助けてくれたすべての人、特にコードでいくつかの書面による説明を入力するのに数分を費やした人たちに感謝し、実際に何が起こっているのかを理解しました:)

初心者のphpの質問です。これを機能させる方法を解決するのに問題があります。基本的に、名前と価格のみを含む価格でメニューを並べ替えたいだけです。

Menu.txt は次のようになります。

Meat,1
Salad,3
Juice,2

しかし、プログラムを実行すると、次のように表示されます。

Array Array
Array Array
Array Array

そして、次のように印刷したいと思います:

Meat,1
Juice,2
Salad,3

array() で変数をそのように使用できないと思うので、実際にどのようにすればよいのでしょうか? コードは下にあり、価格による並べ替えを除いて、他のすべてが私のプログラムでうまく機能します(並べ替えを試みずに.txtファイルを印刷するだけでうまくいくなど..)

<?php
if (file_exists("menu.txt"))
{
    $lines = file("menu.txt");
    $howmanylines = count($lines);
    for($i=0; $i < $lines; $i++) {
        $oneline = explode(",",$lines[$i]);
        $name = $oneline[0];
        $price = $oneline[1];
        $sortingbyprice = array(
            array($name),
            array($price)
        );
        array_multisort($sortingbyprice[0], $sortingbyprice[1], SORT_NUMERIC, SORT_ASC);
        echo $sortingbyprice[0] . " ";
        echo $sortingbyprice[1] . "<br/>";
    }
}
4

4 に答える 4

2

配列を配列に入力し、配列に新しい値を入力するたびにソートしています。

このコードはそうではありません。最初にファイルを反復処理し、次の形式を使用してメニュー項目を連想配列に追加します: $sortingbyprice[product] = price. 次に、配列をソートし、ソートされた配列をループして、出力を生成します (もちろん、ニーズに合わせて変更できます)。

昇順で並べ替えるには:

<?php
if (file_exists("menu.txt"))
{
    $lines = file("menu.txt");
    $sortingbyprice = array();

    foreach ($lines as $line)
    {
        $oneline = explode(",", $line);
        $sortingbyprice[$oneline[0]] = $oneline[1];
    }

    // Sort the array, maintaining key associations.
    asort($sortingbyprice, SORT_NUMERIC);

    foreach ($sortingbyprice as $product=>$price)
    {
        echo $product." ".$price."<br />";
    }
}
?>

降順に並べ替えたい場合は、

    // Sort the array, maintaining key associations.
    arsort($sortingbyprice, SORT_NUMERIC);

つまり、昇順ソートにはasort() 降順ソートには asort() です。

于 2013-01-23T15:05:45.347 に答える
0

データを配列に入れるとエラーが発生します。これは正しい方法です:

$sortingbyprice[] = array('name'=>$oneline[0],'price'=>$oneline[1]);
//then to 'echo' a value within the array:
echo $sortingbyprice['name'];

あなたがこれを行うことができるすべてのレコードを行うには:

foreach($sortingbyprice as $price){
    echo $price['name'].': £'.$price['price'];
}
于 2013-01-23T15:00:55.083 に答える
0

配列全体を並べ替えたい場合は、forループの外でそれを行う必要があります。ループを使用してファイルを配列に解析する必要がありますがusort、ループの外で ( を使用して) 並べ替える必要があります。

配列を読み込んでいるときに、配列の個々の要素を並べ替えているだけです。それらを他の要素と比較してarray_multisortいないため、実際には何もしません。

<?php
if (file_exists("menu.txt")) {
    // Create the array outside the loop
    $sortingbyprice = array();

    $lines = file("menu.txt");
    $howmanylines = count($lines);

    // Note we're using $howmanylines here
    for($i=0; $i < $howmanylines; $i++) {
        // add each row to the array
        $sortingbyprice[] = explode(",", $lines[$i]);
    }

    // Sort the array by its price
    usort($sortingbyprice, function($a, $b){
        return $a[1] - $b[1];
    });

    // echo the array
    for($i=0; $i < $howmanylines; $i++) {
      $row = $sortingbyprice[$i];
      echo $row[0].' '.$row[1].'<br/>';
    }
}

デモ: http://codepad.viper-7.com/0Qegab

于 2013-01-23T15:04:28.850 に答える
-1

あなたがやっている方法は、別の配列を配列に挿入しているだけであることを知っています。配列に別の配列を実際に追加するつもりがない場合を除き、値を囲む配列を省略する必要があります。

$sortingbyprice = array(
    $oneline[0],
    $oneline[1]
);
于 2013-01-23T14:56:45.957 に答える