簡體   English   中英

PHP帶有空項目的二維數組

[英]PHP two-dimensional array with empty items

在另一個用戶的幫助下,我得出了我想要的二維數組的觀點。 我獲得的每個ID($ talente)都會從CSV保存一行。 就像陣列的魅力一樣。 但是輸出使我感到困惑。

這是我使用的CSV:

Schild,1,Licht,1w10,-
Schutz,1,Licht,1w10,-
Licht,4,Licht,1w10,-
Genesung,1,Licht,-,-
Aufopfern,1,Licht,-,-

劇本:

<?php

$talente = $_GET['talente'];

$myFile = fopen("talente.csv", "r");
$csv = [];
while ($data = fgetcsv($myFile, 1000, ",")) {
    $csv[] = $data;
}
fclose($myFile);

        $talentline = array_filter($csv, function($i) use ($talente) {
            return in_array($i, $talente);
        }, ARRAY_FILTER_USE_KEY);


print_r(array_values($talentline));

echo $talentline[1][0];
echo $talentline[2][0];    //line 21.
echo $talentline[3][0];

?>

print_r(array_values($ talentline)); 給我ID的1和3的以下輸出。

[0] => Array (
    [0] => Schutz
    [1] => 1
    [2] => Licht
    [3] => 1w10
    [4] => -
    )
[1] => Array (
    [0] => Genesung
    [1] => 1
    [2] => Licht
    [3] => -
    [4] => -
    )

最后的三個回聲給了我這個:

Schutz注意:未定義的偏移量:第21行Genesung的C:\\ xampp \\ htdocs \\ DvC Generator \\ php \\ test.php中的2

我無法解決兩個問題。 第一個是,打印的行是我期望的行之后的一行。 因此,我期望的是“ Schild”而不是“ Schutz”。

我遇到的最大問題是,腳本將行保存在與ID相等的array-position處。 那不是我所需要的,因為它還保存了空數組元素。 當發送ID 1和3時,我期望的結果是在數組[0]處的Schild和在數組[1]處的Licht。

我希望我能解釋得足夠好。

數組值從0開始計數

所以零是第一,而1是第二

引起“未定義的偏移”的原因是,您僅“保留”在$_GET['talente']輸入數組中找到的數組值。 如果將此值更改為2 ,則將獲得1和3等的未定義偏移通知。

您的第一個問題是數組以[0]開頭,因此如果新talentline數組中有兩個值,則第一個為鍵[0] ,第二個值為鍵[1] 等等

與第二個問題相關,因為您正在比較匿名函數中的鍵值,所以您正在通過詢問$_GET數組給出的值1尋找第一個值(數組鍵[0] )。 這就是為什么它給您帶來意想不到的(但正確的)結果的原因。

解決方案:

對於第二個問題(這是一個編碼錯誤):

您需要通過將鍵值增加+1或將輸入參考值減少-1來調整鍵值,以使輸入與給定的CSV值對齊:

return in_array($i, $talente--); //reduces the input comparison value by 1, 
         //so that the first value ("1") is treated as key "0".

其次,要修復您從腳本稍后引用未設置的數組引用中獲得的通知,請執行以下操作:

print isset($talentline[2][0]) ? $talentline[2][0]; : ""; 
// shorthand PHP stating that if value is set then print it, 
// else don't print anything.

我用來達到此答案的代碼(PHP 5.6.2)。 顯然,由於我沒有要導入的CSV文件等而進行了調整。

<?php
$talente = array(0=>1,1=>3);

$csv[] = array(0=>"Schild", 1=>1, 2=>"Licht", 3=>"1w10", 4=>"-");
$csv[] = array(0=>"Schutz", 1=>1, 2=>"Licht", 3=>"1w10", 4=>"-");
$csv[] = array(0=>"Licht", 1=>4, 2=>"Licht", 3=>"1w10", 4=>"-");
$csv[] = array(0=>"Genesung",1=>1,2=>"Licht",3=>"-",4=>"-");
$csv[] = array(0=>"Aufopfern",1=>1,2=>"Licht",3=>"-",4=>"-");

        $talentline = array_filter($csv, function($i) use ($talente) {
            return in_array($i, $talente--);
        }, ARRAY_FILTER_USE_KEY);
        $talentline = array_filter($talentline);

print_r(array_values($talentline));

print isset($talentline[1][0]) ? $talentline[1][0]; : ""; 
print isset($talentline[2][0]) ? $talentline[2][0]; : ""; 
print isset($talentline[3][0]) ? $talentline[3][0]; : ""; 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM