2017-04-11 22 views
0

我有一個數組減少到字符串,但我必須做很多倍,所以我想使用一些數組PHP的函數(array_walk,array_reduce,...的一些組合... )但沒有一個符合我的需求,但我相信我有一個解決方案,我錯過了。代碼也必須符合PHP5.6。減少數組到字符串,避免foreach

$list =[ 
    'k1' => 'vA1 vA2 vA2', 
    'k2' => 'vB1 vB2 vB2', 
    'k3' => '', 
    'k4' => 'vC1 vC2 vC2', 
    'k5' => NULL, 
    'k6' => 'vD1 vD2 vD2', 
]; 

function reduce($list){ 
    $_buff=""; 
    $_sep=""; 
    foreach ($list as $k => $v){ 
     if($v===null){ 
      continue; 
     } 
     $_buff.="$_sep$k $v"; 
     $_sep="; "; 
    } 
    return $_buff; 
} 

echo reduce($list)."\n"; 

預期的結果是

k1 vA1 vA2 vA2; k2 vB1 vB2 vB2; k3 ; k4 vC1 vC2 vC2; k6 vD1 vD2 vD2 

請注意,不同的行爲,如果值是空字符串或

+1

你能解釋一下你想要的東西嗎?隨着你的代碼給你你需要的輸出。那麼問題是什麼? –

+0

您可以嘗試使用'print_r($ arr,true)',然後在返回的字符串上應用一個或多個'preg_replace()'調用,並使用合適的正則表達式來獲得所需的輸出。 – cars10m

+0

@MASIDDIQUI @MASIDDIQUI我的目標是效率 –

回答

0

我不認爲用foreach或任何array_ *函數會有顯着的執行時間差。只有在記錄增加超過100K的情況下我纔會考慮。

$result = array(); 

array_walk($list, function($value, $key) use (&$result) { 
    if($value!==null) { 
     $result[] = $key .' '. $value; 
    } 
}); 

print_r(implode('; ', $result)); 

你爲什麼不比較來自所有答案所花費的時間,並選擇最好的一個;)

+0

「k3」應該留 –

+0

trim($ value)和!== null應該做。 – Hmmm

-1

我認爲你應該使用array_values,array_keys,array_map,array_filterimplode

function filterNull($v) { 
    if ($v === null) { 
     return false; 
    } 
    return true; 
} 

$filteredList = array_filter($list, 'filterNull'); 
echo implode("; ", array_map(function($k, $v){ 
    return "$k $v"; 
}, array_keys($filteredList), array_values($filteredList))); 

array_filter將刪除空值。 array_keys將檢索密鑰。 array_values將檢索值。 array_map將處理每個單元格。 implode將把數組中的每個單元粘合在一起。

編輯:我改變了整個代碼,因爲我第一次誤讀。現在,該解決方案符合您的需求。

+0

在預期的輸出中包含密鑰..但通過此方法只有值被連接並返回 –

+0

Oups我誤讀了它 –

0

試試這個,

function reduce($list){ 
    $array = []; 
    foreach($list as $key => $value){ 
     $tmp = []; 
     if (!is_null($value)){ 
      $tmp[] = $key; 
      $tmp[] = $value; 
      $array[] = implode(" ", $tmp); 
     } 
    } 
    return implode("; ", $array); 
} 
1

您可以使用array_mapimplode,如:

$list = [ 
    'k1' => 'vA1 vA2 vA2', 
    'k2' => 'vB1 vB2 vB2', 
    'k3' => '', 
    'k4' => 'vC1 vC2 vC2', 
    'k5' => NULL, 
    'k6' => 'vD1 vD2 vD2', 
]; 

$list = array_filter($list, function ($value) { 
    return $value !== null; 
}); 

$array = array_map(function ($key, $value) { 
    return trim($key . ' ' . $value); 
}, array_keys($list), $list); 

echo implode('; ', $array); 

結果是:

K1 VA1 VA2 VA2; k2 vB1 vB2 vB2; K3; k4 vC1 vC2 vC2; k6 vD1 vD2 vD2

+0

不幸的是,「k5」不應該返回 –

+0

現在它會工作..我更新了我的答案 –

+0

@IvanButtinoni雖然這確實避免使用'foreach',我敢肯定它會低效。當你可以用一個'foreach'解決方案進行一次迭代時,'array_map()'和'implode()'遍歷整個列表兩次。 – kunruh

0

我覺得這是一個非常乾淨,簡單的解決方案:

function reduce($list) { 
    $result = ""; 
    foreach ($list as $key => $value) { 
     if ($value === NULL) continue; 

     $result .= " $key $value;"; 
    } 

    // remove trailing semicolon 
    $result = substr($result, 0, -1); 

    return $result; 
} 
1

這不是一個答案,但關於這個問題和答案的一些想法和數據。

我的目標是避免foreach,因爲它很慢。

以一種非常令人驚訝的方式,我的實現是最快的!

如@kunruh foreach比的函數收集和分配存儲器更快對於中間值

下探查該代碼指出:與演示

<?php 

function filterNull($v) { 
    if ($v === null) { 
     return false; 
    } 
    return true; 
} 

class ProfileSolution 
{ 
    const LOOP_LV1 = 200; 
    const LOOP_LV2 = 300; 
    public function reduceIvan($list){ 
     $_buff=""; 
     $_sep=""; 
     foreach ($list as $k => $v){ 
      if($v===null){ 
       continue; 
      } 
      $_buff.="$_sep$k $v"; 
      $_sep="; "; 
     } 
     return $_buff; 
    } 
    public function reduceMateiMihai ($list) 
    { 
     $_list = array_filter($list, function ($value) { 
      return $value !== null; 
     }); 

     $array = array_map(function ($key, $value) { 
      return trim($key . ' ' . $value); 
     }, array_keys($_list), $_list); 

     return implode('; ', $array); 
    } 
    public function reduceMasterFly($list){ 
     $array = []; 
     foreach($list as $key => $value){ 
      $tmp = []; 
      if (!is_null($value)){ 
       $tmp[] = $key; 
       $tmp[] = $value; 
       $array[] = implode(" ", $tmp); 
      } 
     } 
     return implode("; ", $array); 
    } 
    public function reduceKunruh($list) { 
     $result = ""; 
     foreach ($list as $key => $value) { 
      if ($value === NULL) continue; 

      $result .= " $key $value;"; 
     } 

     // remove trailing semicolon 
     $result = substr($result, 0, -1); 

     return $result; 
    } 
    public function reduceHmmm ($list) 
    { 
     $result = array(); 

     array_walk($list, function($value, $key) use (&$result) { 
      if($value!==null) { 
       $result[] = $key .' '. $value; 
      } 
     }); 

     return print_r(implode('; ', $result),true); 
    } 
    public function reduceAd ($list) 
    { 
     $filteredList = array_filter($list, 'filterNull'); 
     return implode("; ", array_map(function($k, $v){ 
      return "$k $v"; 
     }, array_keys($filteredList), array_values($filteredList))); 
    } 

    public function testReduceIvan ($list) 
    { 
     $t=0; 
     while($t++ < self::LOOP_LV2){ 
      $res=""; 
      $res=$this->reduceIvan($list); 
     } 
    } 
    public function testReduceMateiMihai ($list) 
    { 
     $t=0; 
     while($t++ < self::LOOP_LV2){ 
      $res=""; 
      $res=$this->reduceMateiMihai($list); 
     } 
    } 
    public function testReduceMasterFly ($list) 
    { 
     $t=0; 
     while($t++ < self::LOOP_LV2){ 
      $res=""; 
      $res=$this->reduceMasterFly($list); 
     } 
    } 
    public function testReduceKunruh ($list) 
    { 
     $t=0; 
     while($t++ < self::LOOP_LV2){ 
      $res=""; 
      $res=$this->reduceKunruh($list); 
     } 
    } 
    public function testReduceHmmm ($list) 
    { 
     $t=0; 
     while($t++ < self::LOOP_LV2){ 
      $res=""; 
      $res=$this->reduceHmmm($list); 
     } 
    } 
    public function testReduceAD ($list) 
    { 
     $t=0; 
     while($t++ < self::LOOP_LV2){ 
      $res=""; 
      $res=$this->reduceAD($list); 
     } 
    } 


    public function run() 
    { 
     $list =[ 
      'k1' => 'magni dolores eos qui ratione voluptatem sequi nesciunt. Neque', 
      'k2' => 'porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem', 
      'k3' => '', 
      'k4' => 'minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem', 
      'k5' => NULL, 
      'k6' => 'non numquam eius modi tempora incidunt labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis', 
      'k7' => 'aut fugit, sed quia consequuntur', 
      'k8' => 'sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae', 
      'k9' => 'vitae dicta sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam', 
      'k10' => 'nam libero tempore, cum soluta nobis est eligendi optio, cumque nihil impedit, quo minus id, quod maxime placeat, facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam', 
      'k11' => 'inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor', 
      'k12' => 'amet, consectetur, adipisci velit, sed quia', 
      'k13' => Null, 
      'k14' => 'pain, but because occasionally circumstances occur in which toil and', 
      'k15' => 'explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes', 
      'k16' => 'amet, consectetur, adipisci velit, quia', 
      'k17' => 'or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter', 
      'k18' => 'consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain', 
      'k19' => 'voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque', 
      'k20' => Null, 
      'k21' => 'inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit ', 
      'k22' => 'amet, consectetur, velit, sed quia', 
      'k23' => 'laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas', 
      'k24' => 'non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis', 
     ]; 

     $t=0; 
     while($t++ < self::LOOP_LV1){ 
      $this->testReduceIvan($list); 
      $this->testReduceMateiMihai($list); 
      $this->testReduceMasterFly($list); 
      $this->testReduceKunruh($list); 
      $this->testReduceHmmm($list); 
      $this->testReduceAD($list); 
     } 



    } 

} 

$o = new ProfileSolution(); 
$o->run(); 

調用樹(見的問題)數據 Call tree with demo (see the question) data

呼叫樹與現實的數據量 Call tree with realistic amount of data