2015-10-17 171 views
2

這是我在這裏的第一篇文章,我是一個初學者,我希望你會對我容易。 我搜索了一個答案,並閱讀了一些半相關的問題。我已經堅持了幾天,我真的很困惑。 道歉,如果雙桶是一個失禮,把它寫成兩個單獨的問題似乎不太明智。 我是編程新手,直到昨天我才聽說過這個網站,我希望成爲一個看起來很棒的社區的貢獻部分。如何在PHP中使用逗號分隔的字符串對數組進行排序?

我有一個數組,$ newarray:

Array 
(
    [2] => string1,10 
    [7] => string2,15 
    [10] => string3,3 
    [11] => string4,7 
) 

我能夠寫入到一個CSV文件,到目前爲止好:

<?php 
    $file = fopen("/myfile.csv","w"); 
    foreach ($newarray as $line) 
     { 
     fputcsv($file,explode(',',$line)); 
     } 
    fclose($file); 
?> 

不過,我想做兩件事。

  1. 排序由所述數值的相反的順序陣列寫入CSV之前,所以將有一個CSV文件作爲這樣:

    string2,15 
    string1,10 
    string4,7 
    string3,3 
    
  2. 創建第二文件(後寫第一個CSV),其中的數值被去除,如下所示:

    string2 
    string1 
    string4 
    string3 
    

有人可以引導我朝着正確的方向嗎?

+0

您的陣列是'陣列 ( 2 => 'string1,10', 7> 'string2,15', 10 =>「string3,3 ', 11 =>'string4,7', );'? – miglio

回答

1
$arraybase = array(
    2 => 'string1,10', 
    7 => 'string2,15', 
    10 => 'string3,3', 
    11 => 'string4,7', 
); 
function mapping($data){ 
    $array1 = array();//for first csv 
    array_walk($data,function($value,$key)use(&$array1){ 
     $k=explode(',',$value); 
     $array1[$k[1]] = $value; 
    }); 
    krsort($array1); 
    $array2 = array_map(function($value){//for second csv 
     return preg_replace('/,\d+$/','',$value); 
    },$array1); 

    return array("csv1"=>$array1,"csv2"=>$array2); 
} 
$result = mapping($arraybase); 
print('<pre>');print_r($result); 

輸出:

Array 
(
    [csv1] => Array 
     (
      [15] => string2,15 
      [10] => string1,10 
      [7] => string4,7 
      [3] => string3,3 
     ) 

    [csv2] => Array 
     (
      [15] => string2 
      [10] => string1 
      [7] => string4 
      [3] => string3 
     ) 

) 
+0

我試過了,它按鍵(11,10,7,2)排序,而不是CSV中的第二列(15,10,7,3)。不知道我是否使用了正確的術語,但如果您嘗試使用您的代碼並與我的問題進行比較,我相信您會看到不同之處。 但是,您的代碼幫助我理解了一些概念,謝謝。 – jiggers

+0

我已經修復了一個函數。 – miglio

+0

非常感謝你miglio,我已經融入我的代碼,它完美的作品。 – jiggers

1

貴$ newArray要有串連值?如果沒有,最好還是讓他們成爲子陣列:

$newArray = array (
    2 => array(
     0 => 'string1', 
     1 => 10, 
    ), 
    7 => array(
     0 => 'string2', 
     1 => 15, 
    ), 
    10 => array(
     0 => 'string3', 
     1 => 3, 
    ), 
    11 => array(
     0 => 'string4', 
     1 => 7, 
    ), 
); 

然後你就可以排序用在array_multisort:

$strings = array(); 
$numbers = array(); 
foreach ($newArray as $key => $row) { 
    $strings[$key] = $row[0]; 
    $numbers[$key] = $row[1]; 
} 

array_multisort($numbers, SORT_DESC, $strings, SORT_ASC, $newArray); 

當你寫的CSV:

<?php 
    $file = fopen("/myfile.csv","w"); 
    foreach ($newArray as $line) { 
     fputcsv($file, $line); // No need to explode as your data ia already in an array 
    } 
    fclose($file); 
?> 

要寫到僅有字符串的第二個CSV:

<?php 
    reset($newArray); // Sets the pointer in the array back to the beginning so it can be looped over again 
    $file = fopen("/myfile2.csv","w"); 
    foreach ($newArray as $line) { 
     fputcsv($file, $line[0]); 
    } 
    fclose($file); 
?> 
0
$a=array(/* Original array */ 
    2 => 'string1,10', 
    7 => 'string2,15', 
    10 => 'string4,3', 
    11 => 'string4,7' 
);  

$c=array(); 
foreach($a as $index => $value){ 
    list($s,$i)=explode(',', $value); 
    $c[$i]=$value; 
} 
/* Sort in reverse order */ 
krsort($c); 

/* The value of $c is then written to your csv */ 

/* callback function to get the string */ 
function cb(&$item,$key){ 
    list($s,$i)=explode(',',$item); 
    $item=$s; 
} 
array_walk($c, 'cb'); 

echo '<pre>',print_r($b,true),'</pre>'; 
+0

PHP警告:array_walk()期望參數1是數組,在第23行的test.php中給出null。 代碼的輸出是否爲原樣。 – jiggers

+0

糟糕,我在'array_walk'函數中使用了錯誤的變量 - 應該是'$ c'而不是'$ b' – RamRaider

相關問題