質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

2回答

14116閲覧

array_push() expects parameter 1 to be array, null givenというエラーが出てしまう

tacchan

総合スコア60

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

1クリップ

投稿2016/01/09 14:57

PHPでは問題なく動くコードなのですが、CakePHPで実行しようとするとarray_rand() expects parameter 1 to be array, null givenとarray_push() expects parameter 1 to be array, null givenの似たような2つのエラーが出てしまいます。
単純ですが、ランダムで$spotsから1つ要素を取り出し、$choiced_spotに追加するというものです。
何が原因でどこをどう直せばいいのでしょうか?
また、calculation以外でも使うために、外に出して関数として扱いたいとも考えていますが、どうすればいいのでしょうか?
ただ出すだけだと「viewがない」とCakePHPに怒られます。関数名の最初にアンダーバーを付ければよいというものをみて試しましたが、上手くいきませんでした。
よろしくお願いします。

PHP

1<?php 2App::uses('AppController', 'Controller'); 3 4class MySampleDatasController extends AppController { 5 function calculation(){ 6 $choiced_spot = []; 7 $spots =[1, 2, 3, 4, 5, 6, 7]; 8 function choiced_spot($spots, $choiced_spot){ 9 global $spots, $choiced_spot; 10 $randkey = array_rand($spots, 1); 11 array_push($choiced_spot, $spots[$randkey]); 12 }; 13 14 choiced_spot($spots, $choiced_spot); 15 } 16}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

原因は、CakePHPでの関数やグローバル変数の使い方がおかしいところです。
CakePHPの設定や必要なファイルについての説明は省きますが、以下のようにできると思います。

PHP

1public function index() { 2 $k = 5; // 処理の回数 3 $choiced_spot = $this->_calculation($k); // 関数呼び出し 4 Debugger::dump($choiced_spot); // $choiced_spotの中身確認 5} 6 7public function _calculation($k) { 8 $choiced_spot = []; 9 $spots = range(1,7); 10 for ($i=0; $i<$k; $i++) { 11 $choiced_spot[] = $spots[array_rand($spots, 1)]; 12 } 13 return $choiced_spot; 14} 15 16// 実行結果の一例 17array( 18 (int) 0 => (int) 5, 19 (int) 1 => (int) 1, 20 (int) 2 => (int) 4, 21 (int) 3 => (int) 6, 22 (int) 4 => (int) 3 23)

ちなみにコントローラーの関数名の先頭にアンダースコアを付けると、URLで指定してのアクセスができなくなります。

投稿2016/01/10 00:05

coba-coba

総合スコア1409

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tacchan

2016/01/10 02:31

本当にありがとうございます。書いていただいたコードを参考にやり直したら、きちんと動くようになりました。丁寧に書いてくださり、とても勉強になりました。
guest

0

array_rand() expects parameter 1 to be array, null given

array_push() expects parameter 1 to be array, null given

書いてある通りです。
1番目の引数は配列であることが期待されていますが、nullが与えられました。

php

1$randkey = array_rand($spots, 1);

$spots は配列じゃないといけないのに、null になっとるでー!!!という意味。

php

1array_push($choiced_spot, $spots[$randkey]);

$choiced_spot は配列じゃないといけないのに、null になっとるでー!!!という意味。


array_push

イメージ説明

リファレンスの読み方覚えましょう。

投稿2016/01/09 15:09

編集2016/01/09 15:29
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tacchan

2016/01/09 15:50

そうですね。意味はわかります。リファレンスの読み方、array、それくらいは読めますね。 質問に書いた通り、PHPにおいて同じfunctionを書いて試したら、問題なく動いたんです。 $spotsは配列ですよね? $spots = [1, 2, 3, 4, 5, 6, 7]なので。 $choiced_spotも空の配列です。$choiced_spotに関してはarray_pushですから空でも問題ないですよね? なぜ、CakePHPではエラーが発生してしまうのかを知りたいのです。 ただのPHPとして書いたコードはfunction calculation()の内部です。var_dumpで$choiced_spotを表示したら問題なく出ましたよ。 エラーの意味を訳してくれるだけでは問題の実質の解決にはなりません。 なぜ、PHPでは作動してCakeだとエラーが出てしまうのかをお願いします。
退会済みユーザー

退会済みユーザー

2016/01/09 16:01 編集

> PHPでは作動してCakeだとエラーが出てしまうのかをお願いします。 なぜCakeの時にnullになるのか、地道にデバッグしましょう。 それに、オブジジェクト指向を目指すフレームワークを利用していながら変数をグローバルで宣言するというのはオブジェクト指向の思想そのものを反故にしてしまうもの。 global にしているがために、予期しない値が入ってきていると考える方が自然では?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問